2014-02-21 98 views
7

對於StringBuilder類,爲什麼不重載+ =運算符而不是使用唯一的.Append()方法?爲什麼微軟沒有爲stringbuilder重載+ =運算符?

追加()只連接字符串爲啥不只是重載+ =運算符,像這樣:

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

它是效率的情況? 這是一種慣例還是直覺?

感謝,

+1

因爲......那麼它和字符串是一樣的嗎?這就像問爲什麼'List'沒有+ =添加對象... – Shahar

+0

那麼爲什麼有一個stringbuilder類? – PeonProgrammer

+2

我希望我的評論能暗示我對Shahar的榜樣感到不滿意。 – PeonProgrammer

回答

27

算術運算應僅限於像算術值類型。兩個字符串的總和是第三個字符串是非常糟糕的。將加法運算與字符串連接相混淆是一個值得懷疑的選擇,因爲字符串連接遵從極少的加法規則;特別是a + b != b + a

但去那裏串建設者 - 這被定義可變狀態而不是算術值 - 是可怕這兩件事的總和應該是與這兩個加數不同的第三件事。也就是說,a += b必須具有與a = a + b相同的語義,而不是a.MutateWith(b)如果末尾沒有對a的分配,則化合物分配是錯誤的操作員。

更一般地說:永遠不會讓可愛的操作員過載。操作員超負荷的情況下,你可以使兩個複雜的數字增加到三分之一,而不是這樣,你可以讓一個顧客加一罐花生醬等於一個採購訂單,或者一些這樣的傻氣。

+0

所以,如果我理解正確 - 當有人想要重載一個操作符時,他們應該以這樣一種方式實現重載,即它的行爲就像算術操作一樣。它實際上聽起來很明顯,現在我打字了,但我從未想過在考慮字符串連接時a + b!= b + a是多麼混亂。謝謝 – PeonProgrammer

+5

小心解釋爲什麼C#使用+ =和 - =將項目添加到事件處理程序呢? ;) –

+1

@ErikTheViking公平地說,事件處理程序上的+ =事實上*會產生一個新的委託。代表是不可變的,所以'a + = b'實際上確實將一個新的合併代理分配給a。我承認這並不理想,但它至少遵循埃裏剋制定的最大規則。 – dlev

相關問題