1. 三種常用的字串判空串方法:
length法:bool isempty = (str.length == 0);
empty法:bool isempty = (str == string.empty);
general法:bool isempty = (str == "");
2. 深入內部機制:
要**這三種方法的內部機制,我們得首先看看.net是怎樣實現的,也就是要看看.net的源**!然而,我們**找這些源**呢?我們同樣有三種方法:
rotor法:乙個不錯的選擇就是微軟的rotor,這是微軟的乙個源**共享專案。
mono法:另乙個不錯的選擇當然就是真正的開源專案mono啦!
reflector法:最後乙個選擇就是使用反編譯器,不過這種重組的**不一定就是原貌,只不過是一種「近似值」,你可以考慮使用reflector這個反編譯器[1]。
這裡我採用reflector法,我們先來看看一下源**[2](片段):
public sealed class string : icomparable, icloneable, iconvertible, ienumerable, icomparable
// code here
public static readonly string empty;
public static bool operator ==(string a, string b)
public static bool equals(string a, string b)
if ((a != null) && (b != null))
return false;
}private static unsafe bool equalshelper(string ao, string bo)
// code here
}private extern int internallength();
public int length
}// code here
}
rotor裡面string類的**與此沒什麼不同,只是沒有equalshelper方法,代之以如下的宣告:
public extern bool equals(string value);
進一步分析:
首先是empty法,由於string.empty是乙個靜態唯讀域,只會被建立一次(在靜態建構函式中)。但當我們使用empty法進行判空時,.net還會依次展開呼叫以下的方法,而後兩個方法內部還會進行物件引用判等!
public static bool operator ==(string a, string b);
public static bool equals(string a, string b);
private static unsafe bool equalshelper(string ao, string bo);
若使用general法判等的話,情況就「更勝一籌」了!因為.net除了要依次展開呼叫上面三個方法之外,還得首先建立乙個臨時的空字串例項,如果你要進行大量的比較,這恐怕是想一想就很嚇人了!
而對於length法,我們就可以繞過上面這些繁瑣的步驟,直接進行整數(字串長度)判等,我們知道,大多數情況下,整數判等都要來得快(我實在想不出比它更快的了,在32位系統上,system.int32運算最快了)!
另外,我們還可以看到,在equalshelper方法裡面.net會先使用length法來進行判等!可惜的是我無法獲得internallength方法的**。但我在mono的源**裡面看到更簡明的實現:
class string
}// .
}
然而使用length法進行字串判空串時,有一點要注意的,就是你必須先判斷該字串例項是否為空引用,否則將會丟擲nullreferenceexception異常!於是,我們有了乙個經過改進的length法:
void foo(string bar)
3. 最後總結:
從上面的分析我們可以看到,使用length法來進行字串判空串是有著很大的效能優勢的,尤其在進行大量字串判空時!當然首先得判斷字串例項是否為空引用!
C 字串為空判斷
字串 字串為空情況有4種,如下 string str1 string str2 string str3 string.empty string str4 null 判斷方法 c 判斷字串的string類的方法有2個,定義如下 摘要 指示指定的字串是 null 還是 system.string.emp...
iOS判斷字串為空的方法
在程式中使用乙個字串之前,判斷它是否為空是很有必要的,否則程式就可能會出現bug或者崩潰.乙個nsstring字串為空,通常意味著四種情況 1.nsstring物件沒有初始值 nsstring astr 宣告了乙個字串變數,未設定初始值此時,要判斷它是否為空,只需這樣 if astr nil 我曾經...
C 判斷字串是否為空
c 中問號可以判斷字元 引用 事件等是否為空,比如 action?invoke 判斷action是否為空,不為空則呼叫,這樣就避免了用if語句進行是否為空的判斷。開發中會遇到解析json的情況 jsondata.code jslist code jsondata.version jslist ver...