[英]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.