繁体   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