string.empty , , null 以及性能的比较
生活随笔
收集整理的這篇文章主要介紹了
string.empty , , null 以及性能的比较
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
一:這種結(jié)論,個(gè)人覺(jué)得仍然存疑?http://www.cnblogs.com/wangshuai901/archive/2012/05/06/2485657.html?
1.null?
?? null 關(guān)鍵字是表示不引用任何對(duì)象的空引用的文字值。null 是引用類型變量的默認(rèn)值。那么也只有引用型的變量可以為NULL,如果 int i=null,的話,是不可以的,因?yàn)镮nt是值類型的。?
2.,""和String.Empty?
?? 這兩個(gè)都是表示空字符串。只不過(guò)""理論上重新開(kāi)辟內(nèi)存空間,而String.Empty指向一處已分配好的內(nèi)存空間。不過(guò)優(yōu)化器會(huì)優(yōu)化的!?
判定為空字符串的幾種寫法,按照性能從高到低的順序是:?
s.Length == 0????? 優(yōu)于 s == string.Empty????? 優(yōu)于 s == ""?
關(guān)于String.Empty和Null的問(wèn)題是這樣的,這兩個(gè)都是表示空字符串,其中有一個(gè)重點(diǎn)是string str1= String.Empty和 string str2=null 的區(qū)別,這樣定義后,str1是一個(gè)空字符串,空字符串是一個(gè)特殊的字符串,只不過(guò)這個(gè)字符串的值為空,在內(nèi)存中是有準(zhǔn)確的指向的,string str2=null,這樣定義后,只是定義了一個(gè)string 類的引用,str2并沒(méi)有指向任何地方,在使用前如果不實(shí)例化的話,都將報(bào)錯(cuò)。?
二 比較贊同?
string.Empty與""存儲(chǔ)及性能對(duì)比?
首先,看一下String類?
一、String類[只展示探討部分]?
public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>?
{?
public static readonly string Empty;?
static String()?
{?
??? Empty = "";?
??? return;?
}?
[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical]?
public extern String(char[] value);?
??
}?
實(shí)例化某個(gè)string對(duì)象,有兩大種方式,一個(gè)需要new String(),一個(gè)不需要new,例如:?
<1>調(diào)用基本構(gòu)造函數(shù):?
【C#】:? string str=new string(new char[]{'a','b','c'});?
【IL】:?? L_0012: newobj instance void [mscorlib]System.String::.ctor(char[])?
<2>直接賦值:?
【C#】:string str="abc";?
【IL】: L_0018: ldstr “abc”?
在<1>中,是很平常的實(shí)例化方式,而在<2>中生成的IL代碼中并沒(méi)有出現(xiàn)newobj操作符,但出現(xiàn)了ldstr(推送對(duì)元數(shù)據(jù)中存儲(chǔ)的字符串的新對(duì)象引用)。關(guān)于lbstr這種實(shí)例化string的方式,是一種駐留機(jī)制,即:字符串值相同的只實(shí)例化一次(在內(nèi)存中分配一次空間),其它相同的只是統(tǒng)一指向第一次分配的空間。每次string str="字符串",都會(huì)從字符串駐留池中取,如果有,直接使用原來(lái)的,沒(méi)有則創(chuàng)建新的實(shí)例。?
二、Empty與“”差異分析?
public static readonly string Empty;?
?????? static String()?
??????? {?
????????? Empty = "";?
????????? return;?
??????? }?
? 所以,當(dāng)?shù)谝淮螌?shí)例化string類時(shí),靜態(tài)構(gòu)造函數(shù)就初始化Empty,且以后直接獲取只讀Empty值。?
? 例如:?
? string str=string.Empty;//如果這是第一次使用string類,調(diào)用靜態(tài)構(gòu)造函數(shù),初始化Empty,在堆中,開(kāi)辟某一空間,[000001]保存值為“”;?
? string str2=string.Empty//這是第二次使用,所以直接從內(nèi)存讀取到并賦值,指向原始空值堆空間[00000001]。?
??
? 而直接賦值 str="";則會(huì):?
? 例如:?
? string str=“”; //如果是第一次使用string類,(結(jié)合上文string類介紹,ldstr)如同普通類,構(gòu)造函數(shù) string str=new string(char[]{''});在堆中,開(kāi)辟某一空間,[000001]保存值為“”;?
? string str2=""; //這是第二次使用,(結(jié)合上文string類介紹,ldstr).NET對(duì)string有駐留機(jī)制處理,即相同的字符串值,則會(huì)繼續(xù)使用原來(lái)堆中的值數(shù)據(jù),?
????????????????????? //當(dāng)然,這個(gè)過(guò)程必然會(huì)經(jīng)過(guò)一系列的處理,消耗一定的性能!!!?
三、分析總結(jié)?
<1>在內(nèi)存分配上:?
string.Empty與“”,沒(méi)有差別。都是一個(gè)系統(tǒng)上,""值對(duì)象只有一個(gè)!!!?
<2>在性能上:?
string.Empty高,不需要在駐留機(jī)制上做處理。?
轉(zhuǎn)載于:https://www.cnblogs.com/min-min-min/p/6251512.html
總結(jié)
以上是生活随笔為你收集整理的string.empty , , null 以及性能的比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ngix 创建新的网站
- 下一篇: Oracle中start with...