string Empty和null三者的區別

2022-01-15 01:53:19 字數 2349 閱讀 2023

這是乙個及其常見的問題,網上已經有關於這個問題的很多討論。但是我覺得都是不求甚解,有一些還是在誤導別人。下面我來說下我對這三者的理解,如有錯誤的地方請大家及時指正。

一:""與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的位址。

可見str1於str2的位址是相同的,也就是說str1會在堆上占用乙個長度為0的空間,而str2不會在堆上開闢新的空間, str2於str1在堆上共享同一空間。

同理對於

string str3=string.empty;

string str4= string.empty;

str3與str4的位址也是相同的。也是在記憶體堆上共享同一空間。如下圖

上圖是str3的位址。                               上圖是str4的位址。

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是在語法級別對」」的優化。

二、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。如下圖

string Empty和null三者的區別

本文 字型 大中小 這是乙個及其常見的問題,網上已經有關於這個問題的很多討論。但是我覺得都是不求甚解,有一些還是在誤導別人。下面我來說下我對這三者的理解,如有錯誤的地方請大家及時指正。一 與string.empty我認為是一樣的。網上有一篇被 了幾十遍的文章是這樣說的string.empty 不分配...

php使用json decode返回NULL

php5.2以後自帶json decode函式,但是對json文字串的格式要求非常嚴格。很可能使用該函式得到的返回值是null 可以使用使用json last error 函式獲取到的返回值來幫助我們判斷出問題的原因。其中如果提示錯誤json error syntax syntax error 表示...

php使用json decode返回NULL

php5.2以後自帶json decode函式,但是對json文字串的格式要求非常嚴格。很可能使用該函式得到的返回值是null 可以使用使用json last error 函式獲取到的返回值來幫助我們判斷出問題的原因。其中如果提示錯誤json error syntax syntax error 表示...