最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

.net 中的StringBuilder和TextWriter區(qū)別

2020-09-18 10:24 作者:朝夕教育  | 我要投稿


最近閑來之余,看了一些開源的類庫,看到有些類庫喜歡用TextWriter類來記錄相關的字符串數(shù)據(jù),感到比較好奇,為啥不用StringBuilder類對象。于是在網(wǎng)上搜索了一番,總結了相關筆記。

StringBuilder類


在 .net 中,字符串作為一種基本的數(shù)據(jù)類型,通常在一個程序中同一個字符串只維護一個副本。也就是說,通過直接給定字符串值的字符串引用會引用到相同數(shù)據(jù)上。這種處理的好處在于它能夠減少字符串所占用的內(nèi)存空間,不需要為多個同樣的字符串開辟多次空間。在C#中 string 類型是一個不變量,給字符串引用賦予新值并不會改變對應內(nèi)存中的數(shù)據(jù),而是設置引用為新字符串位置。

在平時,這種處理邏輯能夠大大減少字符串所占用的內(nèi)存空間,但有的時候,也會起一些反效果,典型的例子就是在一些構造字符串的操作時所生成的中間字符串數(shù)據(jù)。舉個例子:

這是一個很簡單的字符串組裝功能,它將給定的單詞拼接成一個句子,我們希望的是直接拼接成最后的結果,但這段代碼除了生成最終句子外,先前的臨時也會生成出來。也就是說,"Nice "、"Nice to "、"Nice to meet "以及最后字符串"Nice to meet you."會隨著一次次循環(huán)迭代全部構造出來。

但實際上,對于我們來說只需要最后句子即可,中間部分完全不需要。為此,我們需要新的方式來避免無意義的開銷。

StringBuilder就是一種動態(tài)靈活地構造字符串的方法。這種構造字符串的好處在于,它能夠避免構造中間字符串結果,轉(zhuǎn)而直接生成最終的字符串數(shù)據(jù)。按照上面的例子,稍作修改就能得到一個性能更加優(yōu)異的版本,在該版本下只有最后的句子字符串才會被生成。

至于StringBuilder的原理,我個人猜測是該類中維護一個char型列表,然后動態(tài)地修改數(shù)組元素,達到每次拼接時不會生成字符串的目的,只有當顯式調(diào)用命令生成時,才會生成。不過,因為能力有限,我還不知道怎么在runtime這個開源庫中找StringBuilder的實現(xiàn)。

TextWriter類

TextWriter是一個抽象類,按照微軟官方給出的描述,該類指的是可以編寫一個有序字符系列的編寫器。嗯,字都認識,但是這句話感覺就不像是人說的。實際上,我個人對這個類的理解是它是一個寫入器。換句話來說,TextWriter描述了一個寫入的過程,但具體寫什么?向哪里寫入?這不是這個抽象類所關心的話題,而是由其子類所負責。

.net中常用內(nèi)置的一些子類:

  • StreamWriter :這個類相信很多人都熟悉,當需要向文件中寫入數(shù)據(jù)時,往往通過該類寫入數(shù)據(jù)

  • StringWriter :今天本文所需要研究的對象,向字符串寫入

  • HttpWriter : 向網(wǎng)絡流中寫入數(shù)據(jù)

StringWriter類作為TextWriter的一個繼承類,按照MSDN給出的解釋是,用于將信息寫入字符串的TextWriter類對象,這個類看起來和StringBuilder類所做的功能差不多,那么為什么在 .net 中設計兩個不同類做同一個功能呢?


翻了下相關資料,只能說這兩個類是不同設計思路下的產(chǎn)物。StringBuilder是一種靈活構建字符串的類,它不會產(chǎn)生額外的臨時字符串,而StringWriter則將字符串數(shù)據(jù)作為一種寫入的目的地,從這個角度來看,確實也是一種必要的實現(xiàn)。


比如說,有一個函數(shù),它專門是將字符串數(shù)據(jù)記錄下來,具體點,可以想像為日志記錄器將日志信息記錄到某個地方。這樣的情況下,我們提供兩個輸入?yún)?shù),TextWriter類對象表明是一個寫入器,message描述一個日志信息,那么記錄數(shù)據(jù)只需要這樣寫就可以了:

這樣一來,如果將信息記錄到某個文件中,只要這樣寫:

如果想將信息記錄到某個變量中,就是這樣:

總結

? ? ? 總的來說,如果只是單純使用字符串而不涉及到修改字符串值時,直接使用string類型即可。如果需求是更加專注構造某種字符串數(shù)據(jù),那么使用StringBuilder是一個比較好的選擇。如果需求強調(diào)的是將某種格式的字符串數(shù)據(jù)寫入到某個介質(zhì)中,使用TextWriter對應的繼承類會更好,更符合封裝的思想,且不需要過多關注數(shù)據(jù)是怎么寫入的,只要將需要寫入的數(shù)據(jù)傳入到其中即可。

本文轉(zhuǎn)載自博客園:https://www.cnblogs.com/iskcal/p/difference_between_stringbuilder_and_textwriter.html




.net 中的StringBuilder和TextWriter區(qū)別的評論 (共 條)

分享到微博請遵守國家法律
楚雄市| 淄博市| 乡城县| 佳木斯市| 曲麻莱县| 玛沁县| 河东区| 淮阳县| 金堂县| 攀枝花市| 宁津县| 陆河县| 万载县| 沙湾县| 涿鹿县| 萝北县| 聂拉木县| 贵定县| 德格县| 平阳县| 娄烦县| 繁峙县| 中宁县| 石林| 顺昌县| 嘉荫县| 赣州市| 广西| 南木林县| 哈密市| 西乌珠穆沁旗| 湖南省| 盐源县| 沈丘县| 上高县| 惠州市| 西乌珠穆沁旗| 文成县| 铜山县| 西青区| 西宁市|