進一步分析三種常見判空方式的內部機制:
String.Empty 是靜態唯讀欄位,僅在靜態建構函式中建立一次。但呼叫 str == String.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);
後兩個方法內部仍進行物件參考相等比較。
使用 str == "" 時,除了上述三個方法呼叫外,還必須先建立一個臨時空字串實例。大量比較時效能極差。
直接比較 str.Length == 0,繞過複雜呼叫鏈,僅進行整數比較。在 32 位元系統上,Int32 運算最快。.NET 內部 EqualsHelper 亦先以長度比較快速判斷。
Mono 原始碼顯示 String.Length 直接回傳內部 length 欄位:
class String {
private int length;
public int Length { get { return length; } }
}
使用 Length 法前必須先檢查 null 參考,否則會拋出 NullReferenceException。改良寫法:
void Foo(string bar) {
if ((bar != null) && (bar.Length == 0)) { /* ... */ }
}
Length 法在大量字串判空時具有顯著效能優勢,前提是先排除 null 參考。