C#中空值校驗應用場景分析
# 在 C# 編程(尤其是業(yè)務開發(fā))中,空值校驗是保障程序穩(wěn)定性、避免空引用異常(`NullReferenceException`)的核心手段。結合你這段物料分類新增的代碼,我會從**場景+原因+示例**三個維度,清晰告訴你什么情況必須做空值校驗。
一、必須做空值校驗的核心場景
1. 外部輸入/入參校驗(最基礎也最關鍵)
**適用場景**:
- 方法/函數的入參(尤其是外部系統(tǒng)、用戶輸入、第三方接口傳遞的參數)
- 從配置文件、數據庫、消息隊列讀取的數據
- API 接口接收的請求參數
**為什么要做**:
外部數據不受你的代碼控制,可能是 null、空字符串、格式錯誤等,直接使用會導致程序崩潰。
**對應你代碼的示例**:
// 你的代碼中對入口參數的校驗(必須做)
if (receiveEventInfo == null || string.IsNullOrWhiteSpace(receiveEventInfo.Content))
{
LogTextHelper.Warn("物料分類新增失敗:接收的事件信息為空或內容為空");
return;
}如果不校驗:receiveEventInfo.Content 為 null 時,會直接拋出 NullReferenceException,導致整個方法崩潰,甚至影響調用方。
2. 反序列化/類型轉換后的數據校驗
適用場景:
- JSON/XML 反序列化后的對象(如你代碼中
JsonConvert.DeserializeObject的結果) - 數據庫查詢結果(如
FindSingle查不到數據會返回 null) - 類型轉換(如
Convert.ToInt32、TryParse失敗的情況)
為什么要做: 反序列化/查詢可能因數據格式錯誤、數據不存在等原因返回 null,后續(xù)訪問其屬性(如 eventInfo.Archive)會直接報錯。
對應你代碼的示例:
// 反序列化后的對象校驗(必須做)
if (eventInfo == null || string.IsNullOrWhiteSpace(eventInfo.Archive))
{
LogTextHelper.Warn("物料分類新增失?。悍葱蛄谢蟮腁rchive數據為空");
return;
}
如果不校驗:eventInfo 為 null 時,eventInfo.Archive 會觸發(fā)空引用異常,中斷業(yè)務流程。
3. 嵌套對象/多級屬性訪問前
適用場景:
- 訪問對象的嵌套屬性(如
dTOArchive.Name.ZhCN) - 調用對象的方法(如
list.Add()前,list 可能為 null)
為什么要做: C# 中多級屬性訪問時,只要其中一級為 null,就會拋出空引用異常。
對應你代碼的示例:
// 空值保護:防止 Name 為 null 導致 ZhCN 訪問失敗 info.TypeName = dTOArchive.Name?.ZhCN ?? string.Empty;
如果不做保護:dTOArchive.Name 為 null 時,dTOArchive.Name.ZhCN 會直接報錯。
4. 數據庫/緩存操作前的關鍵數據校驗
適用場景:
- 插入/更新數據庫前,校驗核心字段(如主鍵、必填字段)
- 依賴其他數據的操作(如你代碼中父級分類查詢結果)
為什么要做: 核心字段為空會導致數據庫操作失?。ㄈ缰麈I為空、外鍵關聯(lián)失?。?,依賴數據不存在會導致業(yè)務邏輯錯誤。
對應你代碼的示例:
// 父級分類查詢結果校驗(必須做)
if (p_info != null)
{
info.ParentID = p_info.ID;
info.ERPParentID = p_info.ERPID;
}
else
{
string errorMsg = $"物料分類【{dTOArchive.Code}】父級數據不存在,父級ERPID:{dTOArchive.Parent}";
LogTextHelper.Error(errorMsg);
throw new Exception(errorMsg);
}
如果不校驗:p_info 為 null 時,p_info.ID 會報錯,且會將無效的父級ID插入數據庫,導致數據臟污。
5. 可選但建議做的場景
- 集合類型(List/Array):訪問
list.Count前,校驗list != null - 可空值類型(int?/DateTime?):取值前校驗
HasValue - 第三方組件/工具類返回值:如
File.ReadAllText可能返回 null(文件不存在)
二、可以不做空值校驗的場景(對比理解)
不是所有場景都需要校驗,以下情況可省略:
- 內部可控的常量/初始化對象:如
var info = new MaterialTypeInfo();后,info 不可能為 null,無需校驗。 - C# 8.0+ 的可空引用類型(Nullable Reference Types):通過
!操作符明確標記非空(如name!),且代碼經過嚴格靜態(tài)檢查。 - 單元測試中的 mock 數據:數據由你完全控制,且僅用于測試。
總結
- 核心原則:只要數據來源不受代碼直接控制(外部入參、反序列化、數據庫/第三方返回),或涉及多級屬性訪問,必須做空值校驗。
- 校驗目的:避免空引用異常、保障數據合法性、提前攔截錯誤(而非讓程序崩潰)。
- 最佳實踐:校驗時不僅要判斷 null,還要結合業(yè)務判斷“無效值”(如空字符串、0值等,如你代碼中的
string.IsNullOrWhiteSpace)。
到此這篇關于C#中空值校驗應用場景分析的文章就介紹到這了,更多相關C#空值校驗內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
DevExpress實現(xiàn)TreeList節(jié)點互斥的方法
這篇文章主要介紹了DevExpress實現(xiàn)TreeList節(jié)點互斥的方法,對于初學者更好的理解C#有一定的幫助,需要的朋友可以參考下2014-08-08
C#并發(fā)實戰(zhàn)記錄之Parallel.ForEach使用
這篇文章主要給大家介紹了關于C#并發(fā)實戰(zhàn)記錄之Parallel.ForEach使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C#具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-08-08

