asp.net(c#)中String.Empty、NULL、"" 三者到底有啥區別和聯繫? ...
開門見山,首先看下麵代碼,你認為結果分別是什麼?
string str = string.Empty; string str1 = ""; string str2 = null; bool t = string.IsNullOrEmpty(str); bool t1 = string.IsNullOrEmpty(str1); bool t2 = string.IsNullOrEmpty(str2);View Code
輸出結果告訴我們。都是true。是不是很鬱悶,怎麼都是true。難道就沒區別嗎?
這三種賦值的寫法。想必敲過代碼的都寫過。糾結之餘我在網上整理到如下知識。分享於此
網路上說:string.Empty就相當於"",
但這裡說的是“相當於”,不是“等於”
很顯然上面都是賦值,但如果這樣寫,會報錯,同時也驗證了使用前必須先初始化也就是賦值
string str1; bool t1 = string.IsNullOrEmpty(str1); Console.WriteLine(str1);View Code
既然從賦值判斷是相等的。那不同之處在哪裡?難道在分配記憶體空間上?
最常見的一個面試題就是:string str=""和string str=null有什麼區別,這個大家應該都不陌生。回答都是:前者分配記憶體為空字元串的空間,也就是長度為空;但後者根本就不分配空間。所以從效率上來講後者是不是划算?
可網上有的說string str=string.Empty也不分配記憶體空間,開頭說了,Empty相當於"",但現在Empty跟null一樣都是不分配記憶體空間,怎麼又變成一家親了。
網路還有這麼一句話:為了以後跨平臺,使用string.Empty。額。""和null不跨平臺嗎?
以下也是在網路找到的解釋:
String.Empty和Null,這兩個都是表示空字元串
string str1= String.Empty,這樣定義後,str1是一個空字元串,空字元串是一個特殊的字元串,
只不過這個字元串的值為空,在記憶體中是有準確的指向的
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 == 0View Code
最後得到測試的結果如下:
[s == ""]
空字元串, 10315.6250 毫秒 短字元串, 8307.8125 毫秒 長字元串, 8564.0625 毫秒
[s == string.empty]
空字元串, 3573.4375 毫秒 短字元串,8307.8125 毫秒 長字元串, 8603.1250 毫秒
[s.equals("")]
空字元串, 9517.1875 毫秒 短字元串, 7537.5000 毫秒 長字元串, 7576.5625 毫秒
[s.equals(string.empty)]
空字元串, 9540.6250 毫秒 短字元串, 7515.6250 毫秒 長字元串, 7607.8125 毫秒
[s.length == 0]
空字元串, 443.7500 毫秒 短字元串, 443.7500 毫秒 長字元串, 445.3125 毫秒
很明顯用字元串的length屬性是最快的。
得到以下結論:
用s.equals("stringtocompare")來判斷非空字元串是否相等,用 s.length == 0來判斷是否是空字元串(註意這裡不能用這個來判斷字元串為null的情況,否則會出現“未將對象引用設置到對象的實例”的錯誤)。
在2.0中判斷字元串是否為空(包含null的情況)用string.isnullorempty(str);
路過的高手進來討論下,大家友好積極的發言,這三者到底啥區別,是不是正如以上這些解釋。謝謝!