asp.net(c#)中String.Empty、NULL、”” 三者到底有啥區別和聯絡?【討論題】

來源:互聯網
上載者:User

開門見山,首先看下面代碼,你認為結果分別是什嗎? 

       string str = string.Empty;            string str1 = "";            string str2 = null;            bool t = string.IsNullOrEmpty(str);            bool t1 = string.IsNullOrEmpty(str1);            bool t2 = string.IsNullOrEmpty(str2);

輸出結果告訴我們。都是true。是不是很鬱悶,怎麼都是true。難道就沒區別嗎?

這三種賦值的寫法。想必敲過代碼的都寫過。糾結之餘我在網上整理到如下知識。分享於此

網路上說:string.Empty就相當於"",

但這裡說的是“相當於”,不是“等於”

很顯然上面都是賦值,但如果這樣寫,會報錯,同時也驗證了使用前必須先初始化也就是賦值。

        string str1;            bool t1 = string.IsNullOrEmpty(str1);            Console.WriteLine(str1);

既然從賦值判斷是相等的。那不同之處在哪裡?難道在分配記憶體空間上?

最常見的一個面試題就是:string str=""和string str=null有什麼區別,這個大家應該都不陌生。回答都是:前者分配記憶體為空白字串的空間,也就是長度為空白;但後者根本就不分配空間。所以從效率上來講後者是不是划算?

可網上有的說string str=string.Empty也不分配記憶體空間,開頭說了,Empty相當於"",但現在Empty跟null一樣都是不分配記憶體空間,怎麼又變成一家親了。

網路還有這麼一句話:為了以後跨平台,使用string.Empty。額。""和null不跨平台嗎?

以下也是在網路找到的解釋:

String.Empty和Null,這兩個都是表示Null 字元串

string str1= String.Empty,這樣定義後,str1是一個Null 字元串,Null 字元串是一個特殊的字串,

只不過這個字串的值為空白,在記憶體中是有準確的指向的

string str2=null,這樣定義後,只是定義了一個string 類的引用,str2並沒有指向任何地方,在使用前如果不執行個體化的話,都將報錯。textBox1.Text的值為零長度字串 ""。

判定為空白字串的幾種寫法,按照效能從高到低的順序是:

s.Length == 0 優於 s == string.Empty 優於 s == ""

判斷字串是否為空白最好的方法就是 s.Length==0 !

 

緊接著我還找到個有趣的實驗:

一個外國人做了一個測試,測試的對象有5種,誰的效率更高:

s == ""

s == string.empty

s.equals(”")

s.equals(string.empty)

s.length == 0

測試代碼見:http://www.hn1c.com/diannao/dn87571/

測試結果:

最後得到測試的結果如下:

 

[s == ""]

Null 字元串, 10315.6250 毫秒 短字串, 8307.8125 毫秒 長字串, 8564.0625 毫秒

[s == string.empty]

Null 字元串, 3573.4375 毫秒 短字串,8307.8125 毫秒 長字串, 8603.1250 毫秒

[s.equals("")]

Null 字元串, 9517.1875 毫秒 短字串, 7537.5000 毫秒 長字串, 7576.5625 毫秒

[s.equals(string.empty)]

Null 字元串, 9540.6250 毫秒 短字串, 7515.6250 毫秒 長字串, 7607.8125 毫秒

[s.length == 0]

Null 字元串, 443.7500 毫秒 短字串, 443.7500 毫秒 長字串, 445.3125 毫秒

很明顯用字串的length屬性是最快的。

得到以下結論:
用s.equals("stringtocompare")來判斷非Null 字元串是否相等,用 s.length == 0來判斷是否是Null 字元串(注意這裡不能用這個來判斷字串為null的情況,否則會出現“未將對象引用設定到對象的執行個體”的錯誤)。

在2.0中判斷字串是否為空白(包含null的情況)用string.isnullorempty(str);

------------------------------------------------看了大家的評論後,我繼續挖掘了下-------------------------------------------

如果看到以上資訊還不怎麼清晰的話,看下Empty內部定義:public static readonly string Empty  一個靜態唯讀欄位。

我們不妨自己測試下他們在記憶體配置的空間

我們知道stirng是參考型別。參考型別是將對象的實際資料儲存在堆上, 將對象在堆上的地址儲存在棧上,也就是棧上的地址指向堆中的值。或者說參考型別就是指向一個存有值的一個地址。

開啟vs2012測試看在堆上開闢了啥空間

也來做三個測試分別看看Empty,null,""分別在堆上開闢空間的情況

圖一:

 

圖二:

 

圖三:

從圖一和圖二我們可以看出empty和""棧上都有地址,那說明在堆中有指向的值,這就能說明Empty和""都會開闢空間。

但圖三也有個地址,但沒有任何指向。

路過的高手進來討論下,大家友好積極的發言,這三者到底啥區別,是不是正如以上這些解釋。謝謝!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.