一:""與string.Empty我認為是一樣的。網上有一篇被轉載了幾十遍的文章是這樣說的string.Empty 不分配存儲空間,"" 分配一個長度為空的存儲空間,我認為這句話是錯誤並且含糊不清的。
public static readonly String Empty = "";
也就是說string.Empty的內部實現是等於””的。
有一點先說明一下,引用類型是將對象是實際數據保存在堆上, 將對象在堆上的地址保存在棧上。因此string.Empty與””都會在棧上保存一個地址這個地址占4字節,指向內存堆中的某個長度為0的空間,這個空間保存的是string.Empty的實際值。這個我可以用VS2010跟蹤下內存給大家演示。
上圖中的0x01e81228即是變量str在棧中存儲的地址。
對於"",請看下圖
這個圖的效果跟上圖是一樣的,也就是說””也是在棧上保存了一個地址。
聲明如下兩個變量
string str1=””;
string str2=””;
str1與str2的引用會是相同的也就是str1與str2在棧上保存的地址上相同的。請看下圖
上圖是str1的地址。 上圖是str2的地址。
可見str1於str2的地址是相同的,也就是說str1會在堆上占用一個長度為0的空間,而str2不會在堆上開辟新的空間, str2於str1在堆上共享同一空間。
同理對於
string str3=string.Empty;
string str4= string.Empty;
str3與str4的地址也是相同的。也是在內存堆上共享同一空間。如下圖
上圖是str3的地址。 上圖是str4的地址。
public static readonly String Empty = "";
也就是說””是通過CLR進行優化的,CLR會維護一個字符串池,以防在堆中創建重復的字符串。而string.Empty是一種c#語法級別的優化,是在C#編譯器將代碼編譯為IL(即MSIL)時進行了優化,即所有對string類的靜態字段Empty的訪問都會被指向同一引用,以節省內存空間。
所以對””的優化更依賴CLR。
給大家看一下二者編譯後的IL代碼:
string str1=””; 編譯後如下:
ldstr "" //從字符串池中取出一個””(實際上取的是地址)
stfld string ClassLibrary1.Class1::str1 //將””賦給str1(實際上賦的是地址)
string str2=string.Empty; 編譯後如下:
ldsfld string [mscorlib]System.String::Empty//取得string類的靜態字段Empty(實際上取的是地址)
stfld string ClassLibrary1.Class1::str2//將Empty賦給str2(實際上賦的是地址)
總結:說了這麼一大推我自己都覺得羅嗦,而且初學者朋友可能會看不懂。本人語文學的不好,表達能力一般還請大家諒解,下面我會挑要害來說。
“”與string.Empty在用法與性能上基本沒區別。string.Empty是在語法級別對””的優化。
因為string.Empty與””基本是一樣的,所以string.Empty與null的區別也就代表了””與null的區別。
string str1=””;
string str2=null;
如剛才所說str1會在棧上保存一個地址,這個地址占4字節,指向內存堆中的某個長度為0的空間,這個空間保存的是str1的實際值。
str2同樣會在棧上保存一個地址,這個地址也占4字節,但是這個地址是沒有明確指向的,它哪也不指,其內容為0x00000000。如下圖
轉載自:http://www.bitscn.com/pdb/dotnet/201003/181883.html
判斷字符串是否為空最好的方法就是 s.Length==0 !
判定為空字符串的幾種寫法,按照性能從高到低的順序是:
s.Length == 0 優於 s == string.Empty 優於 s == ""
內存監視窗口
當你只定義一個str而不為其分配內存時用string str=null,但是在接下來你使用它之前必須為它賦值如str=“xxxx”也就是為它初始化
而string str= string.Empty是定義和初始化放在了一起它實際是等價於string str=null;str="";
具體使用時,如果你確定在使用前會給str賦值就用string str=null,否則用string str= string.Empty,不然程序運行時可能會引發空指針異常
1、string str = “”與string str = string.empty等效
2、如果只是定義一個string變量,而不為其分配內存,則用string str = null
這種情況是指你在接下來的操作中一定會給str賦值
3、string str = null;str = “”與string str = “”等效