三種常用的字串判空串方法

2021-06-16 03:46:20 字數 2164 閱讀 3782

本文寫作緣起於阮的討論――《fxcop告訴我,檢查乙個字串是否為空要用string.length。》。其實用過fxcop的人都知道它會建議你使用string.length屬性來判斷字串是否為空串,但你又是否明白其中的緣由呢?今天有點閒,特意寫下這篇文章,希望有點幫助。

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法來進行字串判空串是有著很大的效能優勢的,尤其在進行大量字串判空時!當然首先得判斷字串例項是否為空引用!

三種常用的字串判空串方法執行速度比較

三種常用的字串判空串方法 1 bool isempty str.length 0 2 bool isempty str string.empty 3 bool isempty str 哪種方法最快?以下是測試 using system public class strlengthtime datet...

搜尋字串的三種方法

cpp file fp tfopen szxmlfilepath,l rb if fp null return fseek fp,0,seek end uint nlen ftell fp fseek fp,0,seek set 寬字元型別 wchar t pstr read new wchar t...

左旋字串的三種方法

注 有效次數為 總次數 n 如上圖所示,假設對字串左旋6次和左旋2次,得到的結果是一樣的 思路 include include include include pragma warning disable 4996 遮蔽scanf出現的錯誤 char a abcd1234 變數定義成全域性較好 in...