溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

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

發(fā)布時(shí)間:2020-11-03 17:03:10 來(lái)源:億速云 閱讀:170 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān).net 中的 StringBuilder 和 TextWriter 的區(qū)別有哪些,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

StringBuilder 類(lèi)

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

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

string[] words = {"Nice ", "to ", "meet ", "you."};
string sentence = "";
for(i = 0;i < words.Length; i++)
{
  sentence += words[i];
}

這是一個(gè)很簡(jiǎn)單的字符串組裝功能,它將給定的單詞拼接成一個(gè)句子,我們希望的是直接拼接成最后的結(jié)果,但這段代碼除了生成最終句子外,先前的臨時(shí)也會(huì)生成出來(lái)。也就是說(shuō),"Nice "、"Nice to "、"Nice to meet "以及最后字符串"Nice to meet you."會(huì)隨著一次次循環(huán)迭代全部構(gòu)造出來(lái)。但實(shí)際上,對(duì)于我們來(lái)說(shuō)只需要最后句子即可,中間部分完全不需要。為此,我們需要新的方式來(lái)避免無(wú)意義的開(kāi)銷(xiāo)。

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

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 類(lèi)的原理,我個(gè)人猜測(cè)是該類(lèi)中維護(hù)一個(gè)char型列表,然后動(dòng)態(tài)地修改數(shù)組元素,達(dá)到每次拼接時(shí)不會(huì)生成字符串的目的,只有當(dāng)顯式調(diào)用命令生成時(shí),才會(huì)生成。不過(guò),因?yàn)槟芰τ邢?,我還不知道怎么在runtime這個(gè)開(kāi)源庫(kù)中找 StringBuilder 的實(shí)現(xiàn)。

TextWriter 類(lèi)

TextWriter 是一個(gè)抽象類(lèi),按照微軟官方給出的描述,該類(lèi)指的是可以編寫(xiě)一個(gè)有序字符系列的編寫(xiě)器。嗯,字都認(rèn)識(shí),但是這句話(huà)感覺(jué)就不像是人說(shuō)的。實(shí)際上,我個(gè)人對(duì)這個(gè)類(lèi)的理解是它是一個(gè)寫(xiě)入器。換句話(huà)來(lái)說(shuō), TextWriter 描述了一個(gè)寫(xiě)入的過(guò)程,但具體寫(xiě)什么?向哪里寫(xiě)入?這不是這個(gè)抽象類(lèi)所關(guān)心的話(huà)題,而是由其子類(lèi)所負(fù)責(zé)。

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

  • StreamWriter :這個(gè)類(lèi)相信很多人都熟悉,當(dāng)需要向文件中寫(xiě)入數(shù)據(jù)時(shí),往往通過(guò)該類(lèi)寫(xiě)入數(shù)據(jù)
  • StringWriter :今天本文所需要研究的對(duì)象,向字符串寫(xiě)入
  • HttpWriter : 向網(wǎng)絡(luò)流中寫(xiě)入數(shù)據(jù)

StringWriter 類(lèi)作為 TextWriter 的一個(gè)繼承類(lèi),按照MSDN給出的解釋是,用于將信息寫(xiě)入字符串的 TextWriter 類(lèi)對(duì)象,這個(gè)類(lèi)看起來(lái)和 StringBuilder 類(lèi)所做的功能差不多,那么為什么在 .net 中設(shè)計(jì)兩個(gè)不同類(lèi)做同一個(gè)功能呢?翻了下相關(guān)資料,只能說(shuō)這兩個(gè)類(lèi)是不同設(shè)計(jì)思路下的產(chǎn)物。 StringBuilder 是一種靈活構(gòu)建字符串的類(lèi),它不會(huì)產(chǎn)生額外的臨時(shí)字符串,而 StringWriter 則將字符串?dāng)?shù)據(jù)作為一種寫(xiě)入的目的地,從這個(gè)角度來(lái)看,確實(shí)也是一種必要的實(shí)現(xiàn)。

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

public void WriteData(TextWriter writer, string message)
{
  writer.Write(message);
}

這樣一來(lái),如果將信息記錄到某個(gè)文件中,只要這樣寫(xiě):

using var file = new FileStream("./log.txt", FileAccess.Write);
using var writer = new StreamWriter(file);
WriteData(writer, "hello");

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

var writer = new StringBuilder();
WriteData(writer, "hello");
data = writer.ToString();

總結(jié)

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

關(guān)于.net 中的 StringBuilder 和 TextWriter 的區(qū)別有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI