字串是指用來表示文字的 Unicode 字元之循序集合。String 物件是指表示字串的 System..::.Char 物件之循序集合。String 物件的值是循序集合的內容,而該值是不變的。
String 物件稱為不變的 (唯讀),因為建立它之後便無法修改它的值。看起來好像會修改 String 物件的方法,其實是傳回包含已修改的新 String 物件。如果有必要修改字串式物件的實際內容,請使用 System.Text..::.StringBuilder 類別。
字串中的每個 Unicode 字元是由 Unicode 數值類值所定義,也稱為 Unicode 字碼指標或 Unicode 字元的序數 (數字) 值。每個字碼指標都是用 UTF-16 編碼方式編碼,而編碼方式的每個項目之數值是由 Char 物件表示。
單一的 Char 物件通常表示單一的字碼指標,也就是說,Char 的數值等於字碼指標。但是,字碼指標可能需要一個以上的編碼項目。例如,一個 Unicode 補充字碼指標 (Surrogate 字組) 是由兩個 Char 物件所編碼。
索引
序數和區分文化特性的作業之比較
String 類別的成員會在 String 物件上執行序數或語言的作業。序數作業作用在每個 Char 物件的數字值上。而語言作業作用在 String 的值上,並考慮與文化特性相關的大小寫、排序、格式化或剖析規則。語言作業在明確宣告文化特性或隱含目前文化特性的內容中執行。如需目前文化特性的詳細資訊,請參閱 CultureInfo..::.CurrentCulture 主題。
大小寫規則決定如何將 Unicode 字元從大或小寫變更成另一個,例如,從小寫變更為大寫。
格式化規則決定如何將值轉換為它的字串表示,而剖析規則決定如何將字串代表轉換為值。
排序規則決定 Unicode 字元的字母順序,並決定如何比較兩個字串。例如,Compare 方法執行語言比較,而 CompareOrdinal 方法執行序數比較。因此,如果目前的文化特性是美式英文 (U.S. English),Compare 方法會認為 'a' 小於 'A',而 CompareOrdinal 方法會認為 'a' 大於 'A'。
.NET Framework 支援文字、字串和序數規則。文字排序執行區分文化特性的字串比較,而其中某些非英數字元的 Unicode 字元可能有指派的特殊加權。例如,短破折號 ("-") 所指派的加權可能非常小,以致於在排序清單中 "coop" 和 "co-op" 會彼此相鄰顯示。除了沒有特殊狀況,以及所有非英數字元的符號會在所有英數字元的 Unicode 字元之前,字串排序類似於文字排序。
區分文化特性的比較就是任何明確或隱含地使用 CultureInfo 物件的比較,包括 CultureInfo..::.InvariantCulture 屬性所指定的不變文化特性。目前的隱含文化特性是由 Thread..::.CurrentCulture 屬性所指定。
序數排序是以字串中每個 Char 物件的數值為基礎來比較字串。序數比較會自動區分大小寫,因為字元的小寫和大寫各有不同的字碼指標。但是,如果在應用程式中大小寫並不重要的話,您可以指定忽略大小寫的序數比較。這就等於使用不變文化特性來將字串轉換成大寫,然後在結果上執行序數比較。
如需文字、字串和序數排序規則的詳細資訊,請參閱 System.Globalization..::.CompareOptions 主題。
區分文化特性的比較通常適合用來排序,而序數比較則不適合。序數比較通常適合用來判斷兩個字串是否相等 (也就是判斷識別),而區分文化特性的比較則不適合。
比較和搜尋方法的備註會指定方法是不是區分大小寫和 (或) 區分文化特性。根據定義,任何字串 (包括空字串 ("") 在內) 都比 null 參考大,而兩個 null 參考則彼此相等。
正規化
有些 Unicode 字元具有多個對等的二進位表示,這是由許多結合 and/or 的複合字元集所組成。Unicode 標準會定義稱為正規化的處理序,在指定字元的任何對等二進位表示時,這個處理序便會傳回一個二進位表示。可以使用許多演算法來執行正規化,這些演算法稱為正規化表單,必須遵守不同的規則。.NET Framework 目前支援 C、D、KC 及 KD 正規化格式。通常會使用序數比較來評估一對正規化的字串。
安全性考量
如果應用程式做了關於符號識別項 (例如檔名或具名管道) 或保存的資料 (例如 XML 檔案中的文字資料) 的安全性決策,則作業就應該使用序數比較,而非區分文化特性的比較。這是因為區分文化特性的比較可以根據作用的文化特性來產生不同的結果,而序數比較則只能根據所比較字元的二進位值。
功能
String 類別會提供成員來比較 String 物件、傳回 String 物件內的字元或字串的索引、複製 String 物件的值、分割字串或結合字串、修改字串的值、將數字、日期和時間或列舉值格式化成字串,以及將字串正規化。
字串和內嵌的 Null
在 .NET Framework 中,String 物件可以包含內嵌的 null,這些 null 字元會視為字串長度的一部分進行計算。不過,在某些語言例如 C 和 C++,null 字元表示字串結尾,不會被視為字串的一部分,也不會視為字串長度的一部分進行計算。這表示,C 和 C++ 程式設計人員或者以 C 或 C++ 撰寫的程式庫對字串的下列通用假設,在套用至 String 物件時,不一定是有效的:
您應確定具現化 String 物件的原生 C 和 C++ 程式碼 (以及透過平台叫用傳給它 String 物件的程式碼) 請勿假設內嵌的 null 標記字串結尾。
已實作的介面