LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#中null判斷時是該用==還是is?

admin
2025年5月7日 0:44 本文熱度 102

我在.NET 9 、C# 13的工程中使用 TorchSharp 來定義神經(jīng)網(wǎng)絡以完成某個機器學習任務,在所涉及的有個類中定義了如下字段(Tensor是引用類型):
private Tensor _xMean, _xStd; 
然后在某個方法中我需要檢查這兩個字段是否為null :
if (_xMean == null || _xStd == null)     throw new InvalidOperationException("Model has not been trained or normalization parameters (_xMean, _xStd) are not loaded.");
這時出現(xiàn)了編譯錯誤:
“In order for 'torch.Tensor.operator |(torch.Tensor, torch.Tensor)' to be applicable as a short circuit operator, its declaring type 'torch.Tensor' must define operator true and operator false”
出現(xiàn)這個問題是由于 Tensor 類型重載了 “==” 運算符,于是導致這個判斷null這個行為不可用,換用 is 即可:
if (_xMean is null || _xStd is null)    throw new InvalidOperationException("Model has not been trained, cannot save normalization parameters.");



那么到底該如何判斷引用是否為null?

在 C# 中,判斷引用類型是否為 null 時,通常使用 == 運算符,而不是 is。這兩種方式在某些情況下都能用,但它們的語義和適用場景有重要區(qū)別。下面我詳細解釋一下:

1. 使用 == 判斷 null

  • == 是相等性比較運算符,用于檢查兩個操作數(shù)是否相等。
  • 對于引用類型,== 默認比較的是引用是否相同(即兩個變量是否指向同一個對象)。但當其中一個操作數(shù)是 null 時,它會檢查變量是否未引用任何對象。
  • 示例:

string str = null;if (str == null){    Console.WriteLine("str 是 null");}

  • 優(yōu)點:簡潔、直觀,是判斷引用類型是否為 null 的標準做法。
  • 注意:如果某個類型重載了 == 運算符,行為可能會改變,但大多數(shù)情況下(如 string),== null 的表現(xiàn)仍然符合預期。


2. 使用 is 判斷 null

  • is 是類型檢查或模式匹配運算符,在 C# 7.0 之后支持 is null 模式,用于判斷一個表達式是否為 null。
  • 示例:

string str = null;if (str is null){    Console.WriteLine("str 是 null");}

  • 優(yōu)點
    • 更現(xiàn)代的語法,語義更明確。
    • 不會受到 == 運算符重載的影響,因此在某些邊緣情況下更安全。
  • 注意:is null 是編譯時常量模式,性能上與 == null 幾乎沒有差別。


3. 兩者的區(qū)別和選擇建議

  • 語義
    • == null:比較值是否相等,可能被類型重載影響。
    • is null:純粹檢查是否為 null,無副作用。
  • 適用場景
    • 如果你確定代碼中不會涉及 == 運算符重載(例如處理 string 或普通引用類型),== null 是完全可以的,也是傳統(tǒng) C# 代碼中最常見的寫法。
    • 如果你想確保代碼在任何情況下都絕對可靠(比如處理自定義類型可能重載 == 的場景),推薦使用 is null,尤其是在現(xiàn)代 C# 項目中。


4. 推薦

  • 日常使用:用 str == null,簡單直觀,符合大多數(shù)開發(fā)者的習慣。
  • 現(xiàn)代代碼或嚴格場景:用 str is null,更安全且更符合 C# 的演進方向(特別是在模式匹配的上下文中)。


5. 額外提示

  • 如果你使用 C# 8.0 或更高版本,還可以用 null 合并運算符 (??) 或 null 條件運算符 (?.) 來簡化 null 檢查的邏輯。例如:

string str = null;Console.WriteLine(str?.Length ?? 0); // 輸出 0

總結(jié)來說,== null 和 is null 都可以用,但 推薦根據(jù)項目風格和需求選擇一致的用法。如果你在寫新代碼,我個人更傾向于 is null,因為它更現(xiàn)代、更清晰。


閱讀原文:原文鏈接


該文章在 2025/5/7 17:53:42 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務費用、相關報表等業(yè)務管理,結(jié)合碼頭的業(yè)務特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲人成网站在线观看69影院 | 亚洲精品嫩草影院久久 | 亚洲欧美综合人成在线 | 日韩免费看视频三区中文字幕 | 亚洲综合另类一区二区 | 在线观看免费不卡AV网站 |