我試圖找出一個帖子,應該解釋如何正確追加函數適用於StringBuilder。C#StringBuilder如何變化?
我通過這個answer.
穿越了現在,字符串是不可改變的。我明白了。
但是,只要我們嘗試追加某些東西,StringBuilder也會初始化一個新的臨時字符數組。
我試圖找出一個帖子,應該解釋如何正確追加函數適用於StringBuilder。C#StringBuilder如何變化?
我通過這個answer.
穿越了現在,字符串是不可改變的。我明白了。
但是,只要我們嘗試追加某些東西,StringBuilder也會初始化一個新的臨時字符數組。
可變並不意味着它不能創建新的東西。可變只意味着它的狀態可以在構造函數返回後更改。
例如,這是可變的,即使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
可變的可靠證據。
你也可以提到爲什麼StringBuilder是可變的:String對象是不可變的。每次使用String類中的某個方法時,都會在內存中創建一個新的字符串對象,這需要爲該新對象重新分配空間。在需要對字符串進行重複修改的情況下,與創建新的String對象相關的開銷可能會很高。當你想修改一個字符串而不創建一個新對象時,可以使用StringBuilder類。 https://docs.microsoft.com/en-us/dotnet/standard/base-types/stringbuilder – Isma
*Builder
模式是一種創建對象的常用模式,特別是不可變對象,使用更豐富的接口而不是簡單地在構造函數中傳入一堆數據。 X
類和類XBuilder
之間的關係通常是不可變的X
和XBuilder
可以建立一個X. XBuilder
不必是一成不變的,因爲它不是實際的數據類型,你最終需要的,這只是一個暫時的用於構建X
的腳手架。
換句話說,StringBuilder
不是string
的可變版本。它是一個類,一個功能單元,可以幫助您創建一個不可變的string
。你實例化一個StringBuilder
,使用它的各種Append
方法來定義最終字符串中的內容(這在邏輯上還不存在),然後當你完成時,調用myStringBuilder.ToString()
(我認爲它應該有被稱爲BuildString()
),以獲得你想要的實際字符串。
您可以閱讀代碼[here](https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/text/stringbuilder.cs)。長話短說:StringBuilder由char數組支持。 – john
可能重複的[字符串是不可變的,並且stringbuilder是可變的](https://stackoverflow.com/questions/665499/string-is-immutable-and-stringbuilder-is-mutable) –
它們是兩個不同的對象。字符串是不可變的。 StringBuilder不是。 StringBuilder以String開頭的事實並不一定意味着它也必須是不可變的。 :) – user1506104