判斷字串是否為空是日常開發最高頻操作之一。網路上流傳「用 Length == 0 最快」的結論,但缺乏嚴謹測試與原理分析。本文設計科學實驗、實測效能數據、反編譯 IL 解析根本原因,給出有理有據的最佳實踐建議。
| 項目 | 規格 |
|---|---|
| CPU | Intel T2300 1.66GHz (雙核心) |
| 記憶體 | Kingston DDR2 667 1GB |
| OS | Windows XP Professional |
| IDE | Visual Studio 2008 RTM |
| 測試模式 | Release 建置、無偵錯器附著 |
| 迴圈次數 | 1,000,000 次 (100 萬) |
| 測試字串 | 空字串、String.Empty、非空字串 "StringNotEmpty" |
// 方法 1: Length 比較
bool result = (str.Length == 0);
// 方法 2: 靜態比較 String.Empty
bool result = (str == String.Empty);
// 方法 3: 字面常數比較
bool result = (str == "");
// 方法 4: 靜態方法
bool result = String.IsNullOrEmpty(str);
| 測試字串 | Length==0 | ==String.Empty | == "" | IsNullOrEmpty |
|---|---|---|---|---|
| 空字串 ("") | 2109 / 2406 / 2156 | 296 / 406 / 218 | 296 / 406 / 218 | 穩定 ~300 |
| String.Empty | 2109 / 2406 / 2156 | 296 / 406 / 218 | 296 / 406 / 218 | 穩定 ~300 |
| 非空字串 | 2109 / 2406 / 2156 | 296 / 406 / 218 | 296 / 406 / 218 | 穩定 ~300 |

// == String.Empty (ldsfld - 靜態欄位載入)
IL_0010: ldsfld string [mscorlib]System.String::Empty
IL_0015: call bool [mscorlib]System.String::op_Equality(string, string)
// == "" (ldstr - 字面常數載入)
IL_0012: ldstr ""
IL_0017: call bool [mscorlib]System.String::op_Equality(string, string)
// Length == 0 (callvirt 實例屬性存取)
IL_0020: callvirt instance int32 [mscorlib]System.String::get_Length()
IL_0025: ldc.i4.0
IL_0026: ceq
| 指令 | 語意 | 開銷 |
|---|---|---|
ldsfld | 載入靜態欄位位址 (String.Empty 為單一共享實例) | 極低:單一記憶體讀取 |
ldstr | 載入字面常數 (模組中繼資料區,同樣共享) | 極低:同樣單一記憶體讀取 |
callvirt get_Length | 虛擬呼叫實例屬性 getter (需 null 檢查、查虛擬表) | 較高:方法呼叫開銷 + null 檢查 |
結論:Length == 0 涉及虛擬方法呼叫,而 == String.Empty 和 == "" 只是載入已存在的參考位址進行位址比較 (或經過字串內容比較優化),後者顯著更快。
public static bool IsNullOrEmpty(string value)
{
return value == null || value.Length == 0;
}
// 內部仍用 Length == 0,但增加 null 保護
效能介於兩者之間,穩定性最好 (不拋 NullReferenceException)。
str == "" 或 str == String.Empty (語意更清晰)String.IsNullOrEmpty(str) (安全第一)String.IsNullOrWhiteSpace(str) 同時檢查空白字元str.Length == 0 配合 if (str != null) 手動 null 檢查 (極少見必要)"" 和 String.Empty 編譯期指向同一個駐留字串實例ldstr 和 ldsfld 實際載入相同位址== 經運算子多載) 極快,JIT 可能進一步內聯優化效能優化必須建立在實測數據與原理理解之上,而非道聽塗說。這個簡單測試揭示了「直覺最快」往往不是真相的經典案例。