【问题标题】:Why didn't microsoft overload the += operator for stringbuilder? [closed]为什么微软没有为 stringbuilder 重载 += 运算符? [关闭]
【发布时间】:2014-03-22 08:11:09
【问题描述】:

对于 StringBuilder 类,为什么不重载 += 运算符而不是使用唯一的 .Append() 方法?

Append() 只连接字符串,为什么它们不只是像这样重载 += 运算符:

StringBuilder sb = new StringBuilder();
sb += "My string";

这是效率的例子吗? 这是惯例还是直觉?

谢谢,

【问题讨论】:

  • 因为...那它和字符串一样吗?这就像在问为什么Lists 没有 += 来添加对象......
  • 那么为什么要有一个字符串生成器类呢?
  • 我希望我的评论能暗示我对 Shahar 的例子有多么不满意。
  • @PeonProgrammer - string += string 不是连接。这是串联和赋值。字符串是不可变的,因此 string += string 创建了第三个字符串,它是两个字符串连接在一起,然后用这个新字符串覆盖原始字符串变量。另一方面,Stringbuilder 是可变字符串操作,因此 .Append() 不会创建新字符串来替换旧字符串。这样做会抵消 Stringbuilder 的好处。所以你的问题基本上是,为什么 Stringbuilder 不像一个字符串?答案是因为它不是字符串,而是 Stringbuilder
  • 你从我这里得到了一个赞成票,因为你的问题对于新程序员理解 Eric Lippert 的答案非常重要。新程序员犯这种错误的次数太多了。

标签: c#


【解决方案1】:

算术运算应限于行为类似于算术值的类型。两个字符串的和是第三个字符串已经够糟糕了。将加法运算与字符串连接混为一谈是一个值得商榷的选择,因为字符串连接很少遵守加法规则。特别是a + b != b + a

但是为了字符串 builders 去那里 - 根据定义,它们是 可变状态 而不是 算术值 - 是 可怕的两件事的总和应该是不同于这两个被加数的第三件事。也就是说,a += b必须a = a + b具有相同的语义而不是@987654324 @。 如果最后没有对 a 的赋值,则复合赋值是错误的运算符。

更一般地说:永远不要做可爱的运算符重载。存在运算符重载,以便您可以将两个复数加到第三个,而不是让您可以使客户加上一罐花生酱等于采购订单,或者一些类似的愚蠢行为。

【讨论】:

  • 想解释一下为什么 C# 使用 += 和 -= 将项目添加到事件处理程序? ;)
  • @ErikTheViking 公平地说,事件处理程序上的 += 实际上确实产生了一个新的委托。委托是不可变的,因此 a += b 实际上确实为 a 分配了一个新的组合委托。我承认这并不理想,但它至少遵循 Eric 制定的最大规则。
  • @ErikTheViking:dlev 说的是正确的。正如不幸的是,+ 被选择表示字符串的连接,同样不幸的是,+ 表示代表的顺序组合。但同样,就像字符串一样,两个代表添加到第三个。当您在委托上说+= 时,它确实具有a = a + b 的语义。但我从来不喜欢 C# 的这个特性;这对我来说太可爱了。
  • @silkfire:但我们可以编写一个更高效的Complex * double 用户定义运算符,只需将实部和虚部乘以双精度数;这是两个乘法。没有它,我们必须首先通过调用转换器生成Complex (1.5 + 0i),然后执行通常的四次乘法和两次加法以将两个复数相乘。在这种常见情况下,我们可以通过使用专用的用户定义运算符来节省一半以上的工作。
  • 另外,一个矩阵乘以一个标量得到一个新矩阵也不是没有道理的。
猜你喜欢
  • 1970-01-01
  • 2013-01-15
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多