在重载运算符上返回一个新对象似乎是唯一要做的事情。正确?
换句话说:
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
这很痛苦,因为在x的自由部分中复制y的内容要快得多。这样我们就不会复制一个大的对象,并为这位漂亮的垃圾收集者留下一团糟。
我意识到这可以通过简单的x.Add(y)完成。我很好奇是否有办法使用运算符。例如,要弄清楚我们在赋值运算符中并执行优化的例程。
答案 0 :(得分:3)
我个人喜欢C#如何实现这一点。
更明显的是:
x += y;
和
x = x + y;
应该有相同的行为。在C#中,这是强制执行的。由于单独的重载,人们可能会滥用操作员并阻止其操作相同。
性能差异将是如此之小,这也使得它更容易实现和维护,所以我更喜欢C#方法。
答案 1 :(得分:0)
所有数学二元运算符都返回一个新对象。例如。您不希望2 + 3将其中一个的值更改为五个,因为您正在添加它们。换句话说,有问题的运算符的语义非常明确,并通过规范强制执行。如果你想要不同的东西,你必须做出不同的东西:)。而且我个人喜欢它与c ++比较你可以进行重载,这样A = B = C可能导致C被删除,B被取消分配,A等于任何值而不考虑C或B