在重載操作符上返回一個新對象似乎是唯一要做的事情。對?C#優化重載操作符
- 如果你有一個類(X),其中包含一個大的緩衝區緩存的
- 部分包含的內容,剩下的是自由。
- 通過創建一個包含兩個操作數的附加內容的新對象,您已經重載了二元+運算符來合併兩個對象(相同類型)。
換句話說:
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)來完成。我很好奇,如果有一種方法可以使用運營商。例如找出我們在賦值運算符中並執行優化的例程。
你是對的從形式語言的角度來看,這兩者應該完全一樣。雖然,我不確定是否有或應該有任何方法來優化這些場景。 – MandoMando 2009-11-26 17:51:53