2017-10-12 63 views
-1

我試圖找出一個帖子,應該解釋如何正確追加函數適用於StringBuilder。C#StringBuilder如何變化?

我通過這個answer.

穿越了現在,字符串是不可改變的。我明白了。

但是,只要我們嘗試追加某些東西,StringBuilder也會初始化一個新的臨時字符數組。

+0

您可以閱讀代碼[here](https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/text/stringbuilder.cs)。長話短說:StringBuilder由char數組支持。 – john

+0

可能重複的[字符串是不可變的,並且stringbuilder是可變的](https://stackoverflow.com/questions/665499/string-is-immutable-and-stringbuilder-is-mutable) –

+0

它們是兩個不同的對象。字符串是不可變的。 StringBuilder不是。 StringBuilder以String開頭的事實並不一定意味着它也必須是不可變的。 :) – user1506104

回答

1

可變並不意味着它不能創建新的東西。可變只意味着它的狀態可以在構造函數返回後更改。

例如,這是可變的,即使string是不可改變的:

someFoo.FooMethod(); 

是的,我是:

class Foo { 
    public string Bar { get; set; } 

    public void FooMethod() { 
     Bar = new string('!', 10); 
    } 
} 

因爲我們可以通過設置Bar或致電FooMethod改變它的狀態在FooMethod這裏創建一個新的string,但這並不重要。重要的是Bar現在有了新的價值! someFoo的狀態已更改。

我們說StringBuilder是可變的,因爲它的狀態可以改變,而不會創建新的StringBuilder。正如你查過的,StringBuilder存儲一個char數組。每次添加內容時,該char數組都會更改爲其他內容,但不會創建新的StringBuilder。這是StringBuilder可變的可靠證據。

+0

你也可以提到爲什麼StringBuilder是可變的:String對象是不可變的。每次使用String類中的某個方法時,都會在內存中創建一個新的字符串對象,這需要爲該新對象重新分配空間。在需要對字符串進行重複修改的情況下,與創建新的String對象相關的開銷可能會很高。當你想修改一個字符串而不創建一個新對象時,可以使用StringBuilder類。 https://docs.microsoft.com/en-us/dotnet/standard/base-types/stringbuilder – Isma

-1

*Builder模式是一種創建對象的常用模式,特別是不可變對象,使用更豐富的接口而不是簡單地在構造函數中傳入一堆數據。 X類和類XBuilder之間的關係通常是不可變的XXBuilder可以建立一個X. XBuilder不必是一成不變的,因爲它不是實際的數據類型,你最終需要的,這只是一個暫時的用於構建X的腳手架。

換句話說,StringBuilder不是string的可變版本。它是一個類,一個功能單元,可以幫助您創建一個不可變的string。你實例化一個StringBuilder,使用它的各種Append方法來定義最終字符串中的內容(這在邏輯上還不存在),然後當你完成時,調用myStringBuilder.ToString()(我認爲它應該有被稱爲BuildString()),以獲得你想要的實際字符串。