簡體   English   中英

C#優化重載運算符

[英]C# optimizing overloaded operators

在重載的運算符上返回新對象似乎是唯一要做的事情。 對?

  • 如果您的類(X)包含較大的緩沖區
  • 緩沖區的一部分包含內容,其余部分是免費的。
  • 通過創建一個包含兩個操作數的附加內容的新對象,您已經使Binary +運算符過載以合並兩個(相同類型的)對象。

換一種說法:

z = x + y // z is a new object containing the appended data from x and y. 

這顯然很好,因為我們不想在操作過程中操縱x或y。 但是,C#語言規范7.2.2說:

當二進制運算符重載時,相應的賦值運算符(如果有)也將隱式重載。

這意味着:

x += y;  // will create a new x, copy contents of old x merged with y 
         //  and the old x will be garbage collected at some point

這很痛苦,因為僅將y的內容復制到x的自由部分中可能會更快。 這樣一來,我們就不會復制大對象,也不會為好垃圾收集者留下麻煩。

我意識到這可以通過簡單的x.Add(y)來完成。 我很好奇是否有一種使用操作符的方法。 例如,弄清楚我們在賦值運算符內部並執行優化的例程。

我個人喜歡C#如何實現這一點。

更“明顯”的是:

x += y;

x = x + y;

應該有相同的行為。 在C#中,這是強制性的。 對於單獨的過載,人們可能會濫用操作員並阻止其采取同樣的行動。

性能差異將非常小,這也使得它更易於實現和維護,因此我強烈喜歡C#方法。

所有數學二進制運算符都返回一個新對象。 例如,您不希望2 + 3只是將它們中的一個加到5而將其中一個的值更改為5。 換句話說,所討論的運算符的語義非常清晰,並通過規范進行了強制執行。 如果您想要不同的東西,則必須做出不同的:)。 我個人比較喜歡它與c ++的比較,在c ++中,您可以進行重載,例如A = B = C可能導致C被刪除,B被取消分配並且A等於任何值,而與C或B無關

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM