C#中string.empty “” 以及 null

來源:互聯網
上載者:User
string、Empty和null三者的區別作者:佚名出處:IT專家網2010-03-01 13:00

本文介紹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的地址。

  可見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。如

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.