C 關於判斷字串為空的一些方法

2021-06-16 13:15:09 字數 2207 閱讀 7274

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...