标题具有误导性,因此请阅读整个问题:-)。
所谓“复合赋值操作符”我心里有这样的结构op=
,例如+=
。纯赋值运算符(=
)不属于我的问题。
“为什么”我不是指观点,而是某些设计师或其同事等表达其推理(即设计选择的来源)时的资源(书,文章等)。
我对C ++和C#中的不对称感到困惑(是的,我知道C#不是C ++ 2.0)-在C ++中,您将重载运算符+=
,然后几乎完全+
依靠先前定义的运算符自动编写适当的运算符。在C#中是相反的-您过载+
并+=
为您综合了。
如果我没记错的话,后面的方法在使用real时会失去优化的机会+=
,因为必须创建新的对象。因此,这种方法必须具有很大的优势,但是MSDN却不愿透露任何信息。
我想知道这样做的好处是什么,因此,如果您在C#书籍,技术讲座视频,博客文章中发现了解释,我将不胜感激。
我发现最接近的是Eric Lippert博客上的评论为什么C#中重载运算符总是静态的?汤姆·布朗(Tom Brown)。如果首先确定了静态重载,则它仅指示可以为结构重载哪些运算符。这进一步指示了可以为类重载的内容。
我相信这些术语是“复合赋值运算符”。
—
Ixrec
@Ixrec:有时,a + = b有意义,而a = a + b却不:考虑身份可能很重要,A不能重复,无论如何。有时,a = a + b有意义,而a + = b则没有:考虑不可变的字符串。因此,实际上需要一种能力来决定分别使哪个过载。当然,如果所有必要的构建块都存在并且没有明确禁用,则自动生成丢失的块是个好主意。不是说C#允许那个atm,即afaik。
—
Deduplicator 2015年
@greenoldman-我了解这种动机,但就个人而言,我发现
—
Telastyn
*=
对引用类型进行变异在语义上是不正确的。
+=
首先过载似乎是荒谬的。为什么要使组合操作而不是部分操作过载?