字串表現資訊的能力非常強大。對於String,C#提供了很多基本方法,並且對其進行了最佳化,下面介紹下一些基礎知識,可作為參考。
1. 常用方法
方法名 |
靜態或執行個體方法 |
描述 |
| Compare |
|
比較兩個指定的 String 對象。 |
| CompareOrdinal |
|
通過計算每個字串中相應 Char 對象的數值來比較兩個 String 對象。 |
| CompareTo |
|
將此執行個體與指定的對象或 String 進行比較,並返回二者相對值的指示。 |
| Concat |
|
串連 String 的一個或多個執行個體,或 Object 的一個或多個執行個體的值的 String 表示形式。 |
| Contains |
|
返回一個值,該值指示指定的 String 對象是否出現在此字串中。 |
| Copy |
|
建立一個與指定的 String 具有相同值的 String 的新執行個體。 |
| CopyTo |
|
將指定數目的字元從此執行個體中的指定位置複製到 Unicode 字元數組中的指定位置。 |
| EndsWith |
|
確定 String 的執行個體的末尾是否與指定的字串匹配。 |
| GetEnumerator |
|
檢索一個可以逐一查看此字串中的每個字元的對象。 |
| IndexOf |
|
報告 String 或一個或多個字元在此字串中的第一個匹配項的索引。 |
| IndexOfAny |
|
報告指定 Unicode 字元數組中的任一字元在此執行個體中第一個匹配項的索引。 |
| Insert |
|
在此執行個體中的指定索引位置插入一個指定的 String 執行個體。 |
| Intern |
|
檢索系統對指定 String 的引用。 |
| IsInterned |
|
檢索對指定 String 的引用。 |
| Join |
|
在指定 String 數組的每個元素之間串聯指定的分隔字元 String,從而產生單個串聯的字串。 |
| LastIndexOf |
|
報告指定的 Unicode 字元或 String 在此執行個體中的最後一個匹配項的索引位置。 |
| LastIndexOfAny |
|
報告在 Unicode 數組中指定的一個或多個字元在此執行個體中的最後一個匹配項的索引位置。 |
| Normalize |
|
返回一個新字串,其二進位表示形式符合特定的 Unicode 範式。 |
| PadLeft |
|
靠右對齊此執行個體中的字元,在左邊用空格或指定的 Unicode 輸入鍵台以達到指定的總長度。 |
| PadRight |
|
靠左對齊此字串中的字元,在右邊用空格或指定的 Unicode 輸入鍵台以達到指定的總長度。 |
| Remove |
|
從此執行個體中刪除指定個數的字元。 |
| Replace |
|
將此執行個體中的指定 Unicode 字元或 String 的所有匹配項替換為其他指定的 Unicode 字元或String。 |
| Split |
|
返回包含此執行個體中的子字串(由指定 Char 或 String 數組的元素分隔)的 String 數組。 |
| Substring |
|
從此執行個體檢索子字串。 |
| StartsWith |
|
確定 String 執行個體的開頭是否與指定的字串匹配。 |
| ToCharArray |
|
將此執行個體中的字元複製到 Unicode 字元數組。 |
| ToLower |
|
返回此 String 對象的轉換為小寫形式的副本,返回時使用固定地區性的大小寫規則。 |
| ToLowerInvariant |
|
將此執行個體的值轉換為 String。 |
| ToUpper |
|
返回此 String 轉換為大寫形式的副本。 |
| ToUpperInvariant |
|
返回此 String 對象的轉換為大寫形式的副本,返回時使用固定地區性的大小寫規則。 |
| Trim |
|
從此執行個體的開始位置和末尾移除一組指定字元的所有匹配項。 |
| TrimEnd |
|
從此執行個體的結尾移除數組中指定的一組字元的所有匹配項。 |
| TrimStart |
|
從此執行個體的開始位置移除數組中指定的一組字元的所有匹配項。 |
2. 不可變性
字串是不可變的,也就是說,無論你對一個字串做任何操作(增加字元、刪除字元。。。),都不會改變它的值。問題是,我們不能改變它的值怎麼操作字串呢?解決方案就是建立一個新的字串,把操作結果賦值給這個新的字串。
3. 字串池
由於經常用到字串,難免出現大量重複的值。想要最佳化這種浪費記憶體的做法就是:建立一個池,把所有出現過的字串都放在這裡供程式使用。如果都是讀取,無論從空間還是時間角度來看,那肯定大量提高效能。那如果修改呢?大家共用一個資源,通常情況下會造成多線程衝突。這裡就有個nb的特性起作用了,就是字串的不可變性。它不可變,就不存在操作衝突的情況了!!
4. 空間效能考慮
每次修改一個字串都會產生新的string對象,可能會造成字串對象大量產生帶來的效能下降。比如,一萬個a疊加的程式:
string result = "";
for (int i = 0; i < 10000; i++)
{
result += "a";
}
這段程式會產生1+2+3+…..+10000個字串對象,“a”“aa”“aaa”aaaa“。。。。
對於這種效能的問題,解決的方式是使用StringBuilder。它對內部字元資料做修改,而不是產生資料副本,所以會節省大量空間。
StringBuilder result = new StringBuilder();
for (int i = 0; i < 10000; i++)
{
result.Append("a");
}
通過ToString()方法,你可以得到10000個a長度的結果,最終只會產生2個對象,大大節省了記憶體空間。
5. 字串拼接
通過“+”,可以直接拼接多個字串。其實是重載了操作符,底層調用了String.Concat()方法。無論如何,這樣的拼接會產生多個字串結果。通過使用StringBuilder的Append方法來解決一般拼接造成的效能問題。
6. 逸出字元“\”
- 輸出特殊字元的字面值,比如單引號,雙引號,反斜線等等。
- 特殊意義的字元,如\r,\n,\t等等
7. 逐字字串“@”
可以是字串中的逸出字元實效,嘗嘗用在網路地址或者本地檔案系統路徑中。
8. 相等性
String重載了“==”操作符已經被重載,所以String的“==”並不是真的比較reference是否相等,而是比較了值,這和Equals方法一樣。另外,一般來說,字面值一樣的字串,它們引用的都是字串池中的對象執行個體,所以reference也是一樣的。只有在使用new關鍵字建立一個String對象時,才會在託管堆上建立執行個體,擁有不用的reference,也就是用new關鍵字脫離了string池機制的範疇。