对于StringBuilder类,为什么不重载+ =运算符而不是使用唯一的.Append()方法?为什么微软没有为stringbuilder重载+ =运算符?
追加()只连接字符串为啥不只是重载+ =运算符,像这样:
StringBuilder sb = new StringBuilder();
sb += "My string";
它是效率的情况? 这是一种惯例还是直觉?
感谢,
对于StringBuilder类,为什么不重载+ =运算符而不是使用唯一的.Append()方法?为什么微软没有为stringbuilder重载+ =运算符?
追加()只连接字符串为啥不只是重载+ =运算符,像这样:
StringBuilder sb = new StringBuilder();
sb += "My string";
它是效率的情况? 这是一种惯例还是直觉?
感谢,
算术运算应仅限于像算术值类型。两个字符串的总和是第三个字符串是非常糟糕的。将加法运算与字符串连接相混淆是一个值得怀疑的选择,因为字符串连接遵从极少的加法规则;特别是a + b != b + a
。
但去那里串建设者 - 这被定义可变状态而不是算术值 - 是可怕。 这两件事的总和应该是与这两个加数不同的第三件事。也就是说,a += b
必须具有与a = a + b
相同的语义,而不是a.MutateWith(b)
。 如果末尾没有对a
的分配,则化合物分配是错误的操作员。
更一般地说:永远不会让可爱的操作员过载。操作员超负荷的情况下,你可以使两个复杂的数字增加到三分之一,而不是这样,你可以让一个顾客加一罐花生酱等于一个采购订单,或者一些这样的傻气。
所以,如果我理解正确 - 当有人想要重载一个操作符时,他们应该以这样一种方式实现重载,即它的行为就像算术操作一样。它实际上听起来很明显,现在我打字了,但我从未想过在考虑字符串连接时a + b!= b + a是多么混乱。谢谢 – PeonProgrammer
小心解释为什么C#使用+ =和 - =将项目添加到事件处理程序呢? ;) –
@ErikTheViking公平地说,事件处理程序上的+ =事实上*会产生一个新的委托。代表是不可变的,所以'a + = b'实际上确实将一个新的合并代理分配给a。我承认这并不理想,但它至少遵循埃里克制定的最大规则。 – dlev
因为......那么它和字符串是一样的吗?这就像问为什么'List'没有+ =添加对象... – Shahar
那么为什么有一个stringbuilder类? – PeonProgrammer
我希望我的评论能暗示我对Shahar的榜样感到不满意。 – PeonProgrammer