string.empty , , null 以及性能的比较
生活随笔
收集整理的這篇文章主要介紹了
string.empty , , null 以及性能的比较
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
一:這種結論,個人覺得仍然存疑?http://www.cnblogs.com/wangshuai901/archive/2012/05/06/2485657.html?
1.null?
?? null 關鍵字是表示不引用任何對象的空引用的文字值。null 是引用類型變量的默認值。那么也只有引用型的變量可以為NULL,如果 int i=null,的話,是不可以的,因為Int是值類型的。?
2.,""和String.Empty?
?? 這兩個都是表示空字符串。只不過""理論上重新開辟內存空間,而String.Empty指向一處已分配好的內存空間。不過優化器會優化的!?
判定為空字符串的幾種寫法,按照性能從高到低的順序是:?
s.Length == 0????? 優于 s == string.Empty????? 優于 s == ""?
關于String.Empty和Null的問題是這樣的,這兩個都是表示空字符串,其中有一個重點是string str1= String.Empty和 string str2=null 的區別,這樣定義后,str1是一個空字符串,空字符串是一個特殊的字符串,只不過這個字符串的值為空,在內存中是有準確的指向的,string str2=null,這樣定義后,只是定義了一個string 類的引用,str2并沒有指向任何地方,在使用前如果不實例化的話,都將報錯。?
二 比較贊同?
string.Empty與""存儲及性能對比?
首先,看一下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);?
??
}?
實例化某個string對象,有兩大種方式,一個需要new String(),一個不需要new,例如:?
<1>調用基本構造函數:?
【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>中,是很平常的實例化方式,而在<2>中生成的IL代碼中并沒有出現newobj操作符,但出現了ldstr(推送對元數據中存儲的字符串的新對象引用)。關于lbstr這種實例化string的方式,是一種駐留機制,即:字符串值相同的只實例化一次(在內存中分配一次空間),其它相同的只是統一指向第一次分配的空間。每次string str="字符串",都會從字符串駐留池中取,如果有,直接使用原來的,沒有則創建新的實例。?
二、Empty與“”差異分析?
public static readonly string Empty;?
?????? static String()?
??????? {?
????????? Empty = "";?
????????? return;?
??????? }?
? 所以,當第一次實例化string類時,靜態構造函數就初始化Empty,且以后直接獲取只讀Empty值。?
? 例如:?
? string str=string.Empty;//如果這是第一次使用string類,調用靜態構造函數,初始化Empty,在堆中,開辟某一空間,[000001]保存值為“”;?
? string str2=string.Empty//這是第二次使用,所以直接從內存讀取到并賦值,指向原始空值堆空間[00000001]。?
??
? 而直接賦值 str="";則會:?
? 例如:?
? string str=“”; //如果是第一次使用string類,(結合上文string類介紹,ldstr)如同普通類,構造函數 string str=new string(char[]{''});在堆中,開辟某一空間,[000001]保存值為“”;?
? string str2=""; //這是第二次使用,(結合上文string類介紹,ldstr).NET對string有駐留機制處理,即相同的字符串值,則會繼續使用原來堆中的值數據,?
????????????????????? //當然,這個過程必然會經過一系列的處理,消耗一定的性能!!!?
三、分析總結?
<1>在內存分配上:?
string.Empty與“”,沒有差別。都是一個系統上,""值對象只有一個!!!?
<2>在性能上:?
string.Empty高,不需要在駐留機制上做處理。?
轉載于:https://www.cnblogs.com/min-min-min/p/6251512.html
總結
以上是生活随笔為你收集整理的string.empty , , null 以及性能的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ngix 创建新的网站
- 下一篇: Oracle中start with...