我在.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.");
“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.");
在 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)仍然符合預期。
- is 是類型檢查或模式匹配運算符,在 C# 7.0 之后支持 is null 模式,用于判斷一個表達式是否為 null。
string str = null;
if (str is null)
{
Console.WriteLine("str 是 null");
}
- 優(yōu)點:
- 不會受到 == 運算符重載的影響,因此在某些邊緣情況下更安全。
- 注意: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);
總結(jié)來說,== null 和 is null 都可以用,但 推薦根據(jù)項目風格和需求選擇一致的用法。如果你在寫新代碼,我個人更傾向于 is null,因為它更現(xiàn)代、更清晰。
閱讀原文:原文鏈接
該文章在 2025/5/7 17:53:42 編輯過