您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關.net 中的 StringBuilder 和 TextWriter 的區別有哪些,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
StringBuilder 類
在 .net 中,字符串作為一種基本的數據類型,通常在一個程序中同一個字符串只維護一個副本。也就是說,通過直接給定字符串值的字符串引用會引用到相同數據上。這種處理的好處在于它能夠減少字符串所占用的內存空間,不需要為多個同樣的字符串開辟多次空間。在C#中 string 類型是一個不變量,給字符串引用賦予新值并不會改變對應內存中的數據,而是設置引用為新字符串位置。
在平時,這種處理邏輯能夠大大減少字符串所占用的內存空間,但有的時候,也會起一些反效果,典型的例子就是在一些構造字符串的操作時所生成的中間字符串數據。舉個例子:
string[] words = {"Nice ", "to ", "meet ", "you."}; string sentence = ""; for(i = 0;i < words.Length; i++) { sentence += words[i]; }
這是一個很簡單的字符串組裝功能,它將給定的單詞拼接成一個句子,我們希望的是直接拼接成最后的結果,但這段代碼除了生成最終句子外,先前的臨時也會生成出來。也就是說,"Nice "、"Nice to "、"Nice to meet "以及最后字符串"Nice to meet you."會隨著一次次循環迭代全部構造出來。但實際上,對于我們來說只需要最后句子即可,中間部分完全不需要。為此,我們需要新的方式來避免無意義的開銷。
StringBuilder 類就是一種動態靈活地構造字符串的方法。這種構造字符串的好處在于,它能夠避免構造中間字符串結果,轉而直接生成最終的字符串數據。按照上面的例子,稍作修改就能得到一個性能更加優異的版本,在該版本下只有最后的句子字符串才會被生成。
string[] words = {"Nice ", "to ", "meet ", "you."}; StringBuilder sentenceBuilder = new StringBuilder(); for(i = 0;i < words.Length; i++) { sentenceBuilder.Append(words[i]); } string setence = sentenceBuilder.ToString();
至于 StringBuilder 類的原理,我個人猜測是該類中維護一個char型列表,然后動態地修改數組元素,達到每次拼接時不會生成字符串的目的,只有當顯式調用命令生成時,才會生成。不過,因為能力有限,我還不知道怎么在runtime這個開源庫中找 StringBuilder 的實現。
TextWriter 類
TextWriter 是一個抽象類,按照微軟官方給出的描述,該類指的是可以編寫一個有序字符系列的編寫器。嗯,字都認識,但是這句話感覺就不像是人說的。實際上,我個人對這個類的理解是它是一個寫入器。換句話來說, TextWriter 描述了一個寫入的過程,但具體寫什么?向哪里寫入?這不是這個抽象類所關心的話題,而是由其子類所負責。
.net中常用內置的一些子類:
StringWriter 類作為 TextWriter 的一個繼承類,按照MSDN給出的解釋是,用于將信息寫入字符串的 TextWriter 類對象,這個類看起來和 StringBuilder 類所做的功能差不多,那么為什么在 .net 中設計兩個不同類做同一個功能呢?翻了下相關資料,只能說這兩個類是不同設計思路下的產物。 StringBuilder 是一種靈活構建字符串的類,它不會產生額外的臨時字符串,而 StringWriter 則將字符串數據作為一種寫入的目的地,從這個角度來看,確實也是一種必要的實現。
比如說,有一個函數,它專門是將字符串數據記錄下來,具體點,可以想像為日志記錄器將日志信息記錄到某個地方。這樣的情況下,我們提供兩個輸入參數, TextWriter 類對象表明是一個寫入器, message 描述一個日志信息,那么記錄數據只需要這樣寫就可以了:
public void WriteData(TextWriter writer, string message) { writer.Write(message); }
這樣一來,如果將信息記錄到某個文件中,只要這樣寫:
using var file = new FileStream("./log.txt", FileAccess.Write); using var writer = new StreamWriter(file); WriteData(writer, "hello");
如果想將信息記錄到某個變量中,就是這樣:
var writer = new StringBuilder(); WriteData(writer, "hello"); data = writer.ToString();
總結
總的來說,如果只是單純使用字符串而不涉及到修改字符串值時,直接使用string類型即可。如果需求是更加專注構造某種字符串數據,那么使用 StringBuilder 是一個比較好的選擇。如果需求強調的是將某種格式的字符串數據寫入到某個介質中,使用 TextWriter 對應的繼承類會更好,更符合封裝的思想,且不需要過多關注數據是怎么寫入的,只要將需要寫入的數據傳入到其中即可。
關于.net 中的 StringBuilder 和 TextWriter 的區別有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。