| 表示式 | 型別 | 含義 | 記憶體行為 |
|---|---|---|---|
null | 參考型別 | **無參考**,變數不指向任何物件 | 堆疊佔 4/8 位元組,堆積無配置 |
"" | string | 長度為 0 的字串物件 | 每次字面常數可能建立新物件(視編譯器最佳化) |
String.Empty | string | **靜態唯讀**空字串單例 | **全程序僅一個實例**,效能最佳 |
DBNull.Value | DBNull (singleton) | 資料庫 **NULL 值** 的 .NET 表示 | 單例,僅用於 ADO.NET 欄位比較 |
str.Length == 0 — 直接讀取長度屬性,無虛擬呼叫。str == String.Empty — 參考比較,極快。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();
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+ 模式比對更優雅
String.Empty**,跨平台相容性佳。DBNull.Value 判斷**,切勿用 null 或 ""。DataRow["Col"] = null 會自動轉存 DBNull.Value;讀取時若指派給 string 變數會拋出例外,需先判斷。