为什么microsoft没有为stringbuilder重载+ =运算符?

Peo*_*mer 8 c#

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

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

StringBuilder sb = new StringBuilder();
sb += "My string";
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

Eri*_*ert 29

算术运算应限于类似于算术值的类型.两个字符串的总和是第三个字符串是很糟糕的.将加法操作与字符串连接相关联是一个值得怀疑的选择,因为字符串连接遵循很少的加法规则; 特别是a + b != b + a.

但要去那里的字符串构建器 - 根据定义可变状态而不是算术值 - 是可怕的.两件事的总和应该是与两个加法不同的第三件事.也就是说,a += b 必须有相同的语义a = a + b,而不是a.MutateWith(b).如果最后没有赋值,a那么复合赋值是错误的运算符.

更一般地说: 永远不要让可爱的操作员超载.操作员超载是存在的,这样你可以将两个复杂的数字添加到第三个,而不是让你可以让顾客加一罐花生酱等于采购订单,或者一些这样的愚蠢.

  • 注意解释为什么C#使用+ =和 - =来向事件处理程序添加项目呢?;) (6认同)
  • @ErikTheViking:dlev说的是对的.正如遗憾的是,选择"+"来表示字符串的连接,同样不幸的是,"+"意味着代表上的顺序组合.但同样,就像字符串一样,两位代表增加了三分之一.当你在委托上说'+ =`时,它确实具有'a = a + b`的语义.但我从来都不喜欢C#的这个功能; 对我来说似乎太可爱了. (3认同)
  • 此外,将矩阵乘以标量以获得新矩阵也不是没有道理的。 (2认同)