C#优化重载运算符

C#优化重载运算符,c#,c#-3.0,C#,C# 3.0,在重载运算符上返回新对象似乎是唯一要做的事情。对吧? 如果您有一个包含大缓冲区的类(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)
  • 缓冲区的一部分包含内容,其余部分是免费的
  • 通过创建一个包含两个操作数附加内容的新对象,您重载了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
这是痛苦的,因为在x的空闲部分复制y的内容可能会快得多。这样一来,我们就不会复制一个大对象,并给优秀的垃圾收集器留下一片混乱

我意识到这可以通过一个简单的x.Add(y)来完成。我很好奇是否有一种使用操作符的方法。例如,要确定我们在赋值操作符中并执行优化例程。

我个人喜欢C#实现这一点的方式

更“明显”的是:

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

性能差异将非常小,这也使得实现和维护变得更加容易,因此我非常喜欢C#方法。

我个人喜欢C#实现这一点的方式

更“明显”的是:

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


性能差异将非常小,这也使得实现和维护更加容易,因此我强烈喜欢C#方法。

所有数学二进制运算符都会返回一个新对象。例如,您不会因为要添加它们而希望2+3将其中一个的值更改为5。换句话说,所讨论的操作符的语义非常清楚,并通过规范强制执行。如果你想要一些不同的东西,你必须做一些不同的:)。而且我个人喜欢它与C++相比,在这里你可以重载,这样A= B= C会导致C被删除,B是未赋值的,并且等于任何与C或B< /P>< P>无关的值。所有的数学二进制操作符返回一个新的对象。例如,您不会因为要添加它们而希望2+3将其中一个的值更改为5。换句话说,所讨论的操作符的语义非常清楚,并通过规范强制执行。如果你想要一些不同的东西,你必须做一些不同的:)。我个人喜欢它与C++相比,在这里你可以重载,比如A= B= C会导致C被删除,B是未赋值的,并且等于任何值而不考虑C或B/P。你是对的,从正式语言的角度来看,这两个应该完全一样。但是,我不确定是否有或者应该有任何方法来优化这些场景。你是对的,从形式语言的角度来看,这两种场景应该完全相同。不过,我不确定是否有或应该有任何方法来优化这些场景。
x += y;
x = x + y;