對於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