二十八 使用StringBuilder型別

2022-01-30 20:51:11 字數 2637 閱讀 2706

由於string型別代表的是乙個不可變的字串,所以fcl提供了另乙個名為system.text.stringbuilder的型別,它允許我們有效的對字串的字元執行動態操作,以建立乙個string。從邏輯上說,stringbuilder物件中包含乙個字段,它引用由char結構構成的乙個陣列。stringbuilder的成員允許我們操作這個字元,有效的縮減字串的大小或者更改字串中的字元。如果字串變大,超過已經分配的字元的大小,stringbuilder就會自動的分配乙個全新的、更大的陣列,並開始使用新的陣列,前乙個陣列會被垃圾**器**。

用stringbuilder物件構建好字串之後,為了將stringbuilder的字元「轉換」成乙個string,只需呼叫stringbuilder的tostring方法,在內部,該方法只是返回對stringbuilder內部維護的字串的字段的乙個引用,執行效率非常快,因為它不需要進行字元陣列複製。

大多數程式語言(包括c#)都不將stringbuilder類視為乙個基型別,所以我們要像構造其它非基元型別那樣構建stringbuilder物件。

stringbuilder

sb = 

newstringbuilder

();stringbuilder型別提供了

很多構造器,每個構造器的職責是分配和初始化由每個stringbuilder物件維護的狀態:

最大容量:乙個int32值,它指定了可以放在乙個字串中的最大字元數,預設值是int32.maxvalue(約為20億)。一般不用更改這個值,但是可能需要指定乙個較小的最大容量,以確保永遠不會建立乙個超出特定長度的字串,一旦構造好之後,stringbuilder的最大容量就固定下來不能再改變了。

容量:乙個int32值,它指定了可由stringbuilder維護的字元陣列長度。預設為16,如果事先知道要在stringbuilder中放入多少字元,那麼在構造stringbuilder物件的時候,應該使用這個數字來設定好容量。將字串加到字元陣列時,stringbuilder會檢測陣列會不會超過設定的容量,如果會,stringbuilder會自動倍增容量字段,使用乙個新的容量分配乙個新的陣列,並將原始的字元複製到新的陣列中,隨後,原始陣列可以被垃圾器收集,此過程會損害效能,所以在構建stringbuilder物件時要設定乙個合適的初始容量。

字元陣列:乙個由char結構構成的陣列,它負責維護「字串」中的字符集。構造乙個stringbuilder時,可以傳遞乙個string來初始化字元陣列,如果不傳遞乙個字串,陣列剛開始就不包含任何字元,也就是說length屬性會返回0。

和string不同,stringbuilder代表的是乙個可變的字串,也就是說stringbuilder的大多數成員都會修改字元陣列中的內容,同時不會在託管堆上分配新的物件,stringbuilder只在以下兩種情況下公分配乙個新的物件:

(1)試圖動態的構造乙個字串,它的長度超過了事先設定的「容量」

(2)試圖在呼叫stringbuilder的tostring方法之後修改陣列

stringbuilder的大多數方法返回的都是到相同stringbuilder物件的乙個引用,所以,可以把以下幾個操作鏈結到一起完成:

stringbuilder

sb = 

newstringbuilder

();string

" ",

"hellow"

,"world"

).replace(

' ',

'-').remove(4,3).tostring();

console

.writeline(s);

string和stringbuilder

類提供的方法並不是完全配對的,例如,string提供了tolower,toupper,endswith,padleft,padright,trim等方法,但stringbuilder類沒有提供任何與之對應的方法。另一方面stringbuilder類提供了乙個功能更全面的replace方法,它允許替換作為乙個字串的一部分的字元或者字串(而不是一定要替換整個字串)。由於這兩個類不完全對應,所以經常在它們倆之間轉換以便完成任務。例如,為了構造乙個字串,將所有的字元轉換成大寫,然後在其中插入乙個字串,需要下面這樣的**:

//構造乙個stringbuilder來執行字串操作

stringbuilder sb 

=new

stringbuilder();

//使用stringbuilder來執行一些字串操作" 

", "hellow", 

"world

").replace(''

, '-'

);//

將stringbuilder轉換成string,以便將所有字元轉換成大寫

string s 

=sb.tostring().toupper();

//清除stringbuilder(分配乙個新的char陣列)

sb.length =0

;//將全部大寫的string載入到stringbuilder中7, 

"test-");

//將stringbuilder轉換成strings =

sb.tostring();

console.writeline(s);

//顯示hellow-test-world  

二十八 模組

模組 在電腦程式的開發過程中,隨著程式 越寫越多,在乙個檔案裡 就會越來越長,越來越不容易維護。為了編寫可維護的 我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的 就相對較少,很多程式語言都採用這種組織 的方式。在python中,乙個.py檔案就稱之為乙個模組 module 使用模組有...

Lua程式設計(二十八)

lua語言會在執行源 之前先對其進行預編譯。生成預編譯檔案 也被稱為二進位制檔案,binary chunk 的最簡單方式是,使用標準發行班中附帶的luac程式。luac o prog.lc prog.lua上述命令會建立檔案prog.lua的預編譯版本prog.lc。lua解析器會像執行普通lua ...

CUDA學習(二十八)

多處理器級別 在更低層次上,應用程式應該最大化多處理器內各個功能單元之間的並行執行 如 硬體多執行緒 中所述,gpu多處理器依賴於執行緒級並行性來最大限度地利用其功能單元。因此利用率與駐留經線的數量直接相關。在每個指令發布時間,乙個warp排程器選擇乙個準備好執行下乙個指令的warp 如果有的話 然...