C#优化重载运算符

时间:2009-11-26 17:33:49

标签: c# c#-3.0

在重载运算符上返回一个新对象似乎是唯一要做的事情。正确?

  • 如果您有一个包含大缓冲区的类(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

这很痛苦,因为在x的自由部分中复制y的内容要快得多。这样我们就不会复制一个大的对象,并为这位漂亮的垃圾收集者留下一团糟。

我意识到这可以通过简单的x.Add(y)完成。我很好奇是否有办法使用运算符。例如,要弄清楚我们在赋值运算符中并执行优化的例程。

2 个答案:

答案 0 :(得分:3)

我个人喜欢C#如何实现这一点。

更明显的是:

x += y;

x = x + y;

应该有相同的行为。在C#中,这是强制执行的。由于单独的重载,人们可能会滥用操作员并阻止其操作相同。

性能差异将是如此之小,这也使得它更容易实现和维护,所以我更喜欢C#方法。

答案 1 :(得分:0)

所有数学二元运算符都返回一个新对象。例如。您不希望2 + 3将其中一个的值更改为五个,因为您正在添加它们。换句话说,有问题的运算符的语义非常明确,并通过规范强制执行。如果你想要不同的东西,你必须做出不同的东西:)。而且我个人喜欢它与c ++比较你可以进行重载,这样A = B = C可能导致C被删除,B被取消分配,A等于任何值而不考虑C或B