程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中string.Empty和null的差別詳解

C#中string.Empty和null的差別詳解

編輯:C#入門知識

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。以下圖


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved