电竞比分网-中国电竞赛事及体育赛事平台

分享

asp.net(c#)中String.Empty、NULL、"" 三者到底有啥區(qū)別和聯(lián)系?【討論題】

 昵稱(chēng)10504424 2013-02-22

 

開(kāi)門(mén)見(jiàn)山,首先看下面代碼,你認(rèn)為結(jié)果分別是什么? 

復(fù)制代碼
       string str = string.Empty;
string str1 = "";
string str2 = null;
bool t = string.IsNullOrEmpty(str);
bool t1 = string.IsNullOrEmpty(str1);
bool t2 = string.IsNullOrEmpty(str2);
復(fù)制代碼

輸出結(jié)果告訴我們。都是true。是不是很郁悶,怎么都是true。難道就沒(méi)區(qū)別嗎?

這三種賦值的寫(xiě)法。想必敲過(guò)代碼的都寫(xiě)過(guò)。糾結(jié)之余我在網(wǎng)上整理到如下知識(shí)。分享于此

網(wǎng)絡(luò)上說(shuō):string.Empty就相當(dāng)于"",

但這里說(shuō)的是“相當(dāng)于”,不是“等于”

很顯然上面都是賦值,但如果這樣寫(xiě),會(huì)報(bào)錯(cuò),同時(shí)也驗(yàn)證了使用前必須先初始化也就是賦值。

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

既然從賦值判斷是相等的。那不同之處在哪里?難道在分配內(nèi)存空間上?

最常見(jiàn)的一個(gè)面試題就是:string str=""和string str=null有什么區(qū)別,這個(gè)大家應(yīng)該都不陌生。回答都是:前者分配內(nèi)存為空字符串的空間,也就是長(zhǎng)度為空;但后者根本就不分配空間。所以從效率上來(lái)講后者是不是劃算?

可網(wǎng)上有的說(shuō)string str=string.Empty也不分配內(nèi)存空間,開(kāi)頭說(shuō)了,Empty相當(dāng)于"",但現(xiàn)在Empty跟null一樣都是不分配內(nèi)存空間,怎么又變成一家親了。

網(wǎng)絡(luò)還有這么一句話:為了以后跨平臺(tái),使用string.Empty。額。""和null不跨平臺(tái)嗎?

以下也是在網(wǎng)絡(luò)找到的解釋?zhuān)?/p>

String.Empty和Null,這兩個(gè)都是表示空字符串

string str1= String.Empty,這樣定義后,str1是一個(gè)空字符串,空字符串是一個(gè)特殊的字符串,

只不過(guò)這個(gè)字符串的值為空,在內(nèi)存中是有準(zhǔn)確的指向的

string str2=null,這樣定義后,只是定義了一個(gè)string 類(lèi)的引用,str2并沒(méi)有指向任何地方,在使用前如果不實(shí)例化的話,都將報(bào)錯(cuò)。textBox1.Text的值為零長(zhǎng)度字符串 ""。

判定為空字符串的幾種寫(xiě)法,按照性能從高到低的順序是:

s.Length == 0 優(yōu)于 s == string.Empty 優(yōu)于 s == ""

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

 

緊接著我還找到個(gè)有趣的實(shí)驗(yàn):

一個(gè)外國(guó)人做了一個(gè)測(cè)試,測(cè)試的對(duì)象有5種,誰(shuí)的效率更高:

s == ""

s == string.empty

s.equals(”")

s.equals(string.empty)

s.length == 0

測(cè)試代碼見(jiàn):http://www./diannao/dn87571/

測(cè)試結(jié)果:

最后得到測(cè)試的結(jié)果如下:

 

[s == ""]

空字符串, 10315.6250 毫秒 短字符串, 8307.8125 毫秒 長(zhǎng)字符串, 8564.0625 毫秒

[s == string.empty]

空字符串, 3573.4375 毫秒 短字符串,8307.8125 毫秒 長(zhǎng)字符串, 8603.1250 毫秒

[s.equals("")]

空字符串, 9517.1875 毫秒 短字符串, 7537.5000 毫秒 長(zhǎng)字符串, 7576.5625 毫秒

[s.equals(string.empty)]

空字符串, 9540.6250 毫秒 短字符串, 7515.6250 毫秒 長(zhǎng)字符串, 7607.8125 毫秒

[s.length == 0]

空字符串, 443.7500 毫秒 短字符串, 443.7500 毫秒 長(zhǎng)字符串, 445.3125 毫秒

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

得到以下結(jié)論:
用s.equals("stringtocompare")來(lái)判斷非空字符串是否相等,用 s.length == 0來(lái)判斷是否是空字符串(注意這里不能用這個(gè)來(lái)判斷字符串為null的情況,否則會(huì)出現(xiàn)“未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例”的錯(cuò)誤)。

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

路過(guò)的高手進(jìn)來(lái)討論下,大家友好積極的發(fā)言,這三者到底啥區(qū)別,是不是正如以上這些解釋。謝謝!

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多