首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 判斷字串為空的 6 種寫法效能實測:Length == 0 最快,IsNullOrEmpty 最實用

     編輯:關於C語言

C# 提供多種判斷字串是否為空的方式,但效能與適用情境各異。本文實測 6 種常見寫法在 1 億次迴圈下的執行時間,分析優缺點,給出最佳實務建議。

六種判斷方式

  1. str == ""
  2. str.Equals("")
  3. str == string.Empty
  4. str.Equals(string.Empty)
  5. str.Length == 0
  6. string.IsNullOrEmpty(str)

測試環境與方法

  • 三種字串狀態:""、string.Empty、"0123456789"(非空)。
  • 每種寫法執行 1 億次 if 判斷,使用 DateTime.Now 計時(單一執行緒、Release 模式、關閉偵錯器)。
  • 關閉非必要程式,減少系統干擾。

實測結果摘要(兩輪平均)

判斷方式空字串 ""string.Empty非空字串綜合排名
str.Length == 0最快最快最快🥇 1
string.IsNullOrEmpty(str)次快次快次快🥈 2
str == "" / str == string.Empty中等中等中等🥉 3
str.Equals("") / str.Equals(string.Empty)較慢較慢較慢4

結論: Length == 0 在三種狀態下效能皆最佳;IsNullOrEmpty 緊隨其後,且具備 null 安全性。

深度分析與避坑指南

1. str == "" / str == string.Empty

  • 僅判斷「值為空字串」,無法處理 null,若 str == null 直接回傳 false(不拋例外,但邏輯可能錯誤)。
  • 編譯器會將 string.Empty 優化為 "",兩者 IL 碼相同,效能無差異。

2. str.Equals("") / str.Equals(string.Empty)

  • 同樣無法處理 null,呼叫 null.Equals(...) 會拋 NullReferenceException。
  • 虛擬方法呼叫開銷略大於 == 運算子(字串多載為靜態 op_Equality)。

3. str.Length == 0 —— 效能王者但有陷阱

  • 直接讀取字串物件的 Length 屬性(非虛擬、內部實作為欄位存取),零分配、零方法呼叫,極快。
  • 致命缺陷: str == null 時拋 NullReferenceException。
  • 僅適用於確定不為 null 的情境(如剛初始化、或經過非 null 檢查)。

4. string.IsNullOrEmpty(str) —— 綜合最佳選擇

  • 原始碼實作:return str == null || str.Length == 0;,結合 null 檢查與長度判斷。
  • 效能僅次於 Length == 0,差距微乎其微(單次納秒級)。
  • 語意清晰、程式碼簡潔、null 安全,為官方推薦寫法。
  • .NET Core / .NET 5+ 進一步內建優化(JIT 內建),效能更強。

最佳實務建議

預設首選: string.IsNullOrEmpty(str) —— 絕大多數業務邏輯,可讀性與安全性兼顧。

效能極致場景(熱路徑、大量迴圈、已保證非 null): str.Length == 0 —— 搭配 Debug.Assert(str != null) 或程式碼註釋確保前置條件。

需同時檢查空白字元: string.IsNullOrWhiteSpace(str) —— 內含 Trim() 邏輯,效能稍低但功能更完整。

擴充:.NET 6+ 新增 string.IsNullOrEmpty 的效能優化

自 .NET 6 起,string.IsNullOrEmpty 被標記為 [Intrinsic],JIT 編譯器可直接內建為 str == null || str.Length == 0 的機器碼,消除方法呼叫開銷,實測效能已逼近甚至等同手寫 Length == 0(在非 null 情況下)。

總結:日常開發請放心使用 string.IsNullOrEmpty;極少數經分析器確認的熱點路徑,才考慮手寫 Length == 0 並加註釋說明非 null 保證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved