詳解C#中的string與String。本站提示廣大學習愛好者:(詳解C#中的string與String)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C#中的string與String正文
目錄
小寫 string 與大寫 String 聲明與初始化 string string 的不可變性 正則 string 與原義 string string 的本義序列 格式化字符串 操作子字符串 字符串的 null 與 ""(空) 可進步功能的 StringBuilder序
字符串是 String 類型的對象,它的值是文本。 在外部,文本被存儲為 Char 對象的順序只讀集合。 C# 字符串末尾沒有以 null 開頭的字符;因而 C# 字符串可以包括恣意數目的嵌入式 null 字符(“\0”)。 字符串的 Length 屬性代表它包括的 Char 對象的數量,而不是 Unicode 字符的數量。 若要訪問字符串中的各個 Unicode 碼位,請運用 StringInfo 對象。
小寫 string 與大寫 String
在 C# 中,關鍵字 string 是 String 的別名。 因而,String 與 string 等效,也就是說您想用哪個就用哪個。String 類提供了很多用於平安地創立、操作和比擬字符串的辦法。此外,C# 言語還重載某些運算符來簡化罕見的字符串操作。
聲明與初始化 string
請看示例:
static void Main(string[] args) { // 聲明但不初始化 string msg1; // 聲明並初始化為 null string msg2 = null; // 作為一個空字符串停止初始化,用 Empty(空) 常量而不是字面值的 ""(空) string msg3 = String.Empty; // 用正則的字符串字面值停止初始化 string oldPath = "c:\\windows"; // 直接以字符串初始化 string newPath = @"c:\windows"; // 也可以運用 System.String String content = "Hello World!"; // 運用 const 避免 msg4 被竄改 const string msg4 = "I'm const!"; // 可以運用隱式類型 var var msg5 = "Hi!"; // 運用 String 結構器停止初始化 char[] letters = { 'A', 'B', 'C' }; string alphabet = new String(letters); Console.Read(); }
【留意】除了在運用字符數組初始化字符串時以外,不要運用 new 運算符創立字符串對象。
運用 Empty 常量值初始化字符串可新建字符串長度為零的 String 對象。零長度字符串的字符串表示方式為 ""。運用 Empty 值(而不是 null)初始化字符串可以降低發作 NullReferenceException 的能夠性。我們經常會在嘗試訪問字符串之前運用靜態 IsNullOrEmpty(String) 辦法驗證字符串的值。
string 的不可變性
字符串對象是不可變的:即它們創立之後就無法更改。 一切看似修正字符串的 String 辦法和 C# 中的運算符,實踐上都以新字符串對象的方式前往後果。 在上面的示例中,當銜接 s1 和 s2 的內容以構成一個字符串時,不會修正兩個原始字符串。 += 運算符會創立一個包括組合內容的新字符串。 這個新對象賦給變量 s1,而最初賦給 s1 的對象由於沒有其他任何變量包括對它的援用而釋放,將在後續被渣滓回收。
示例一:
static void Main(string[] args) { var s1 = "Hi!"; var s2 = "Fanguzai!"; //拼接 s1 和 s2,並且修正 s1 指向的值 s1 += s2; //即 s1 = s1 + s2; Console.WriteLine(s1); Console.Read(); }
圖:var s1 = "Hi!"; var s2 = "Fanguzai!";
圖:s1 = s1 + s2; 重新修正 s1 的指向
由於“修正”字符串實踐上是創立一個新字符串,因而創立對字符串的援用時必需慎重。 假如創立了對字符串的援用,然後“修正”原始字符串,則該援用指向的仍是原始對象,而不是修正字符串時創立的新對象。
static void Main(string[] args) { var s1 = "Hi! "; var s2 = s1; //在 s1 重新賦值後,這次沒有重新修正 s2 指向的值 s1 += "Fanguzai!"; //即 s1 = s1 + "Fanguzai!"; Console.WriteLine(s2); Console.Read(); }
圖:var s1 = "Hi!"; s2 = s1; 他們指向相反的援用地址
圖:s1 = s1 + "Fanguzai!"; 會創立一個沒有援用的 "Fanguzai!",偏重新修正 s1 指向的值。
正則 string 與原義 string
假如必需嵌入 C# 提供的本義符,則應運用正則字符串:
static void Main(string[] args) { var coluString = "Col1\tCol2\tCol3"; var rowString = "Row1\r\nRow2\r\nRow3"; Console.WriteLine(coluString); Console.WriteLine("====="); Console.WriteLine(rowString); Console.Read(); }
假如字符串文本包括反斜槓字符(例如在文件途徑中),為方便起見和進步可讀性,應運用原義字符串。由於原義字符串保存換行符作為字符串文本的一局部,因而可用於初始化多行字符串。在原義字符串中嵌入引號時請運用雙引號。上面的示例演示原義字符串的一些罕見用處:
static void Main(string[] args) { var path = @"C:\Windows"; var text = @"Are you Fanguzai? I'm Fanguzai!"; Console.WriteLine(path); Console.WriteLine("====="); Console.WriteLine(text); Console.Read(); }
string 的本義序列
【備注】編譯時,原義字符串轉換為一切本義序列均堅持不變的普通字符串。因此,假如在調試器監視窗口中檢查原義字符串,則看到的將是編譯器添加的本義字符,而不是源代碼中的原義版本。 例如,原義字符串 @"C:\temp.txt" 在監視窗口中將顯示為 "C:\\temp.txt"。
格式化字符串
格式字符串是內容可以在運轉時靜態確定的一種字符串。采用以下方式創立格式字符串:運用靜態 Format 辦法並在大括號中嵌入占位符,這些占位符將在運轉時交換為其他值。
private static void Main(string[] args) { const string name = "Fanguzai"; var s = string.Format("Hi, {0}!", name); //運用占位符 Console.WriteLine(s); Console.Read(); }
操作子字符串
子字符串是包括在字符串中的恣意字符序列。 運用 Substring 辦法可以基於原始字符串的一局部創立新字符串。 可以運用 IndexOf 辦法搜索子字符串的一個或多個婚配項。 運用 Replace 辦法可將指定子字符串的一切婚配項交換為一個新字符串。 與 Substring 辦法一樣,Replace 實踐上前往的也是新字符串,而不修正原始字符串。
private static void Main(string[] args) { const string s1 = "Hi, Fanguzai!"; Console.WriteLine(s1.Substring(4)); //截取 Console.WriteLine(s1.Replace("Hi","Hello")); //交換 Console.WriteLine(s1.IndexOf(",", StringComparison.Ordinal)); //取索引 Console.Read(); }
字符串的 null 與 ""(空)
空字符串是不包括字符的 System.String 對象的實例。 在各種編程方案中常常會運用空字符串表示空白文本字段。 可以對空字符串調用辦法,由於它們是無效的 System.String 對象。
var s = string.Empty;
相反,null 字符串並不援用 System.String 對象的實例,任何對 null 字符串調用辦法的嘗試都會生成 NullReferenceException。 但是,可以在串聯和比擬操作中將 null 字符串與其他字符串一同運用。
private static void Main(string[] args) { const string s1 = "Hi, Fanguzai!"; string s2 = null; var s3 = string.Empty; var s4 = s1 + s2; //有值的字符串與 null 拼接 Console.WriteLine("s4: {0}", s4); Console.WriteLine(""); var isTrue = (s2 == s3); Console.WriteLine("isTrue: {0}", isTrue); Console.WriteLine(); var s5 = s3 + s2; Console.WriteLine("s5: {0}", s5); Console.WriteLine(); Console.Read(); }
可進步功能的 StringBuilder
.NET 中的字符串操作已高度優化,大少數狀況下不會明顯影響功能。但在某些使用場景中,例如在執行數百甚至好幾億次的循環中,字符串操作很能夠會影響功能。 StringBuilder 類創立了一個字符串緩沖區,用於在順序執行少量字符串操作時提供更好的功能。 StringBuilder 字符串可以重新分配一般字符(內置字符串數據類型所不支持的字符)。例如,此代碼在不創立新字符串的狀況下更改了一個字符串的內容:
static void Main(string[] args) { var sb = new StringBuilder("~ Hi! Fanguzai!"); sb[0] = '^'; Console.WriteLine(sb); Console.Read(); }
以上就是本文的全部內容,希望本文的內容對大家的學習或許任務能帶來一定的協助,同時也希望多多支持!