C#中string.Empty和null的差別詳解。本站提示廣大學習愛好者:(C#中string.Empty和null的差別詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中string.Empty和null的差別詳解正文
這是一個及其罕見的成績,網上曾經有關於這個成績的許多評論辯論。然則我認為都是囫囵吞棗,有一些照樣在誤導他人。上面我來講下我對這三者的懂得,若有毛病的處所請年夜家實時斧正。
一:""與string.Empty我以為是一樣的。網上有一篇被轉載了幾十遍的文章是如許說的string.Empty 不分派存儲空間,"" 分派一個長度為空的存儲空間,我以為這句話是毛病而且暧昧不清的。
1、現實上Empty是string類中的一個靜態的只讀字段,他的界說是如許的:
public static readonly String Empty = "";
也就是說string.Empty的外部完成是等於””的。
2、我要辯駁string.Empty 不分派存儲空間,"" 分派一個長度為空的存儲空間這個不雅點。起首string.Empty與""都邑分派存儲空間,詳細的說是都邑在內存的棧和堆上分派存儲空間。
有一點先解釋一下,援用類型是將對象是現實數據保留在堆上, 將對象在堆上的地址保留在棧上。是以string.Empty與””都邑在棧上保留一個地址這個地址占4字節,指向內存堆中的某個長度為0的空間,這個空 間保留的是string.Empty的現實值。這個我可以用VS2010跟蹤下內存給年夜家演示。
上圖中的0x01e81228等於變量str在棧中存儲的地址。
關於"",請看下圖
這個圖的後果跟上圖是一樣的,也就是說””也是在棧上保留了一個地址。
3、CLR會對字符串停止優化,所以””和string.Empty也都邑被優化。
聲明以下兩個變量
string str1=””;
string str2=””;
str1與str2的援用會是雷同的也就是str1與str2在棧上保留的地址上雷同的。請看下圖
上圖是str1的地址。
上圖是str2的地址
4、假如非要說””與string.Empty有甚麼分歧的話,我認為1是寫法紛歧樣,string.Empty看起來悅目~!~。2是在優化 方面稍有差異。string.Empty於c#對””在語法級其余優化。這點可以經由過程string.Empty的外部完成看出來。
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是在語法級別對””的優化。
2、string.Empty與null的差別
由於string.Empty與””根本是一樣的,所以string.Empty與null的差別也就代表了””與null的差別。
1、 那就是string.Empty會在堆上占用一個長度為0的空間,而null不會。詳細內容以下:
string str1=””;
string str2=null;
如適才所說str1會在棧上保留一個地址,這個地址占4字節,指向內存堆中的某個長度為0的空間,這個空間保留的是str1的現實值。
str2異樣會在棧上保留一個地址,這個地址也占4字節,然則這個地址是沒有明白指向的,它哪也不指,其內容為0x00000000。以下圖