- 字符串使用類String(默認值為String.Empty)來表示,小寫形式string是C#語言中的數據類型
- 字符串是Char類型的字符數組
- 字符串是引用類型,它的值位於堆上
- 字符串變量一旦賦值,它的值就不再能夠改變,因此字符串對象是不變對象
- 運算符==和!=運算符比較的是string對象的值,而不是引用。實際上是因為String重載了這兩個運算符
- 如果要改變一個字符串的值,因為字符串是不變類型,因此結果都是生成一個新的字符串對象,其值為新的字符串值,指向原字符串變量的指針改為指向新的字符串對象
- 如果在一個循環中改變字符串值,或者合並多個字符串的值,那么由於每次都會創新新的字符串對象,因此會產生許多臨時的中間字符串對象,這十分影響性能和執行效率,並造成資源浪費
為了提高性能和保證執行效率,.Net Framework維護了一個字符串池(暫存池、常量池),用以對使用過的字符串進行緩存。當為字符串類型的變量賦值時,此值同時被放入常量池中,在以后需要創新新的字符串時,CLR會首先檢查池中是否存在相同值的字符串對象,如果存在,就將變量指向池中已經存在的對象,那么舊的對象又得以重用了,這個過程稱為“字符串駐留”。而常量池緩存字符串對象的原則是:直接出現在代碼中的字符串都會被放入“常量池”,而動態創建的字符串對象並不會被放入。可使用string.IsInterned(string)進行測試。
為了某些情況下效率低下的問題,比如在循環中改變字符串的值,可以使用StringBuilder類以提高效率,
將StringBuilder和String類對比,String值的追加操作每次都會分配新的內存,而StringBuilder僅當StringBuilder對象緩沖區太小以至於無法容納新數據時才分配內存。因此,當字符串追加操作並不多時,最好還是使用String類。但如果需要任意多次追加字符串,例如在一個循環中,使用StringBuilder類比使用String類性能更高。盡管StringBuilder有着諸多好處,但創建一個StringBuilder實例比創建一個String實例需要花費更多的內存資源,因此使用StringBuilder也是要講場合的。
格式化字符串:
{index[,alignment][:formatString]}
index,參數說明符,從零開始的整數,可標識對象列表中對應的項。如果由參數說明符指定的對象是空引用,則格式項將被字符串“”替換
alignment,可選參數,指示包含格式化值的區域的最小寬度。如果格式化值的長度小於alignment,則用空格填充該區域。如果alignment為負,則格式化的值將在該區域中左對齊;如果alignment為正,則格式化的值將右對齊。如果沒有指定alignment,則該區域的長度為格式化值的長度。如果指定alignment,則需使用逗號。
formatString,可選的格式說明符字符串。如果相應對象是數值,則指定“數字格式字符串”,如果相應對象是DateTime對象,則指定“日期和時間格式字符串”,或者如果相應對象是枚舉值,則指定“枚舉格式字符串”。如果不指定“格式字符串”,則對數字、日期和時間或者枚舉類型“使用常規(G)格式說明符”。如果指定“格式說明符”,則需要使用冒號。
如果需要在格式化字符串中使用花括號,必須使用連續兩個花括號的形式“{{...}}”
格式數值型數據可以使用“標准數字格式字符串”和自定義數字格式字符串“,”標准數字格式字符串“的格式為”格式說明符+精度說明符“,如”N1“,表示精度為1的數字格式(小數點后1位)
| 格式字符 | 說明 | 格式字符 | 說明 |
|---|---|---|---|
| G/g | 常規格式 | N/n | 數字格式 |
| C/c | 貨幣格式 | P/p | 百分比格式 |
| D/d | 十進制格式 | R/r | 往返格式 |
| E/e | 科學計數(指數)格式 | X/x | 十六進制格式 |
| F/f | 固定點格式 |
自定義數字格式字符串
| 格式說明符 | 說明 |
|---|---|
| 0 | 零占位符 |
| # | 數字占位符 |
| .(點號) | 小數點 |
| ,(逗號) | 千位分隔符和數字比例換算 |
| % | 百分比點位符 |
| E0、E+0、E-0、e0、e+0、e-0 | 科學記數法 |
| |轉義符 | |
| ‘ABC’、”ABC“ | 字符串 |
| ;(分號) | 部分分隔符 |
| 其他 | 所有其他字符 |
Double myDouble = 1234567890;
int myInt = 42;
Console.WriteLine(string.Format(”{0:(###) ### - ####}“, myDouble)); // (123) 456 - 7890
Console.WriteLine(string.Format(”{0:My Number = #“, myInt)); // My Number = 42
”“
正則表達式
這里有一篇寫得比較詳細的博文,可供參考。
