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

C# 深度解析:null、String.Empty、""、DBNull.Value 的差異與效能比較

     編輯:ASP.NET 基礎

核心概念對照

表示式型別含義記憶體行為
null參考型別**無參考**,變數不指向任何物件堆疊佔 4/8 位元組,堆積無配置
""string長度為 0 的字串物件每次字面常數可能建立新物件(視編譯器最佳化)
String.Emptystring**靜態唯讀**空字串單例**全程序僅一個實例**,效能最佳
DBNull.ValueDBNull (singleton)資料庫 **NULL 值** 的 .NET 表示單例,僅用於 ADO.NET 欄位比較

判斷空字串的效能排序(快→慢)

  1. str.Length == 0 — 直接讀取長度屬性,無虛擬呼叫。
  2. str == String.Empty — 參考比較,極快。
  3. str == "" — 需載入字面常數,極微幅度較慢。

**建議統一使用 str.Length == 0 或 string.IsNullOrEmpty(str)**。

資料庫欄位讀取的正確判斷邏輯

// 1. ExecuteScalar 可能回傳 null(無資料列)
object result = cmd.ExecuteScalar();
if (result == null) { /* 無資料 */ }

// 2. 有資料列但欄位為 DBNull
if (result == DBNull.Value) { /* 欄位為 NULL */ }

// 3. 確定非 DBNull 才轉型
string val = (result == DBNull.Value) ? "" : result.ToString();

DataTable/DataRow 欄位存取模式

DataRow row = dt.Rows[0];

// 寫入:指派 null 會自動轉為 DBNull.Value
row["Name"] = null; // 實際儲存 DBNull.Value

// 讀取:三種等價寫法
bool isNull = row.IsNull("Name");
bool isNull2 = row["Name"] == DBNull.Value;
bool isNull3 = Convert.IsDBNull(row["Name"]);

// 取值並轉為空字串而非 null
string name = row["Name"] as string ?? ""; // C# 7+ 模式比對更優雅

關鍵結論

  • null ≠ "" ≠ String.Empty ≠ DBNull.Value,四者型別與語意完全不同。
  • **字串初始化/比較優先用 String.Empty**,跨平台相容性佳。
  • **資料庫 NULL 只能用 DBNull.Value 判斷**,切勿用 null 或 ""。
  • DataRow["Col"] = null 會自動轉存 DBNull.Value;讀取時若指派給 string 變數會拋出例外,需先判斷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved