超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

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

C#中null判斷時(shí)是該用==還是is?

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

我在.NET 9 、C# 13的工程中使用 TorchSharp 來定義神經(jīng)網(wǎng)絡(luò)以完成某個(gè)機(jī)器學(xué)習(xí)任務(wù),在所涉及的有個(gè)類中定義了如下字段(Tensor是引用類型):
private Tensor _xMean, _xStd; 
然后在某個(gè)方法中我需要檢查這兩個(gè)字段是否為null :
if (_xMean == null || _xStd == null)     throw new InvalidOperationException("Model has not been trained or normalization parameters (_xMean, _xStd) are not loaded.");
這時(shí)出現(xiàn)了編譯錯(cuò)誤:
“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)這個(gè)問題是由于 Tensor 類型重載了 “==” 運(yùn)算符,于是導(dǎo)致這個(gè)判斷null這個(gè)行為不可用,換用 is 即可:
if (_xMean is null || _xStd is null)    throw new InvalidOperationException("Model has not been trained, cannot save normalization parameters.");



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

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

1. 使用 == 判斷 null

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

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

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


2. 使用 is 判斷 null

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

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

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


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

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


4. 推薦

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


5. 額外提示

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

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

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


閱讀原文:原文鏈接


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