[英]C# optimizing overloaded operators
在重載的運算符上返回新對象似乎是唯一要做的事情。 對?
換一種說法:
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.