標籤:style blog color 使用 os io strong 資料
平時用的最多的莫過於string了,但有時遇到的一些問題,不仔細想還真容易出錯,今天我就來總結一下string的用法。
1.string是一個參考型別,平時我們比較string對象,比較的是對象的值而不是對象本身如:
string strA="abcde";string strB="abc";string strC="de";Console.WriteLine(strA == (strB+strC));//trueConsole.WriteLine((object)strA == (object)(strB+strC));//false
因為字串內容相同但引用的不是同一個執行個體
2.string對象是不可修改的
string strA="abcde";strA="aaaaa";
從表面上看似修改了strA的內容,事實上"abcde"沒有被修改,而是從新建立了一個對象"aaaaa",然後把該對象的引用賦給strA,最後"abcde"會被作為記憶體回收。
3.string的建立
直接賦值:string strA="abcde";//建立一個內容為abcde的string對象,然後將該對象的引用賦給strA
構造: char[] arr={‘a‘,‘b‘,‘c‘,‘d‘,‘e‘};
string strA=new string(arr);//這裡只列舉一種
注意:沒有String str=new String("abcde");這樣的構造,string 是 .NET Framework 中String的別名。
3.string參數傳遞
string是參考型別,我們試圖在一個函數裡改變這個值
static void Main(string[] args){ string strA = "abcde"; Deal(strA); Console.WriteLine(strA); Console.ReadLine();}static void Deal(string str){ str = str.Substring(0, 2);}
結果:abcde
原因:通過值傳遞參考型別的參數時,有可能更改引用所指向的資料,如某類成員的值。但無法更改引用本身的值,通過ref關鍵字傳遞參數可解決該問題。
static void Main(string[] args){ string strA = "abcde"; Deal(strA); Console.WriteLine(ref strA); Console.ReadLine();}static void Deal(ref string str){ str = str.Substring(0, 2);}
結果:ab
此時傳遞的是引用本身,而不是副本
4.null 字串和Null 字元串
null 字串:沒有分配記憶體;Null 字元串分配了記憶體,但記憶體裡面沒有資料.
static void Main(string[] args){ string strA = "1"; string strB = string.Empty; string strC = null; Console.WriteLine(int.Parse(strA));//正確 Console.WriteLine(int.Parse(strB));//輸入字串的格式不正確 Console.WriteLine(strC.ToString());//未將對象引用設定到對象的執行個體。 Console.ReadLine();}
內建方法字串是否為 null 或為空白:
IsNullOrEmpty等同於 if (str == null || str.Equals(String.Empty))
IsNullOrWhiteSpace等同於 if (str == null || str.Equals(String.Empty) || str.Trim().Equals(String.Empty))
5.StringBuilder
string strA="abc"for(int i=0;i<10000;i++){ strA+="abc";}Consolse.WriteLine(strA);
儘管該代碼會出現以使用字串串聯來將新的字元追加到命名為 strA 的現有字串,它實際上會為每個串聯操作建立新的 String 對象。大大的降低了效能。可使用 StringBuilder 類代替String 類多次更改字串值,StringBuilder 對象是可變的,當進行追加或刪除字串中的子字串時,不會建立新的對象,而是在原來的對象上進行修改。 完成 StringBuilder 對象的值的修改後,可以調用其 StringBuilder.ToString 方法將其轉換為字串
StringBuilder strA=new StringBuilder();for(int i=0;i<10000;i++){strA.Append("abc");}Consolse.WriteLine(strA.ToString());