C#中null判断时是该用==还是is?
|
admin
2025年5月7日 0:44
本文热度 99
|
我在.NET 9 、C# 13的工程中使用 TorchSharp 来定义神经网络以完成某个机器学习任务,在所涉及的有个类中定义了如下字段(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”出现这个问题是由于 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。这两种方式在某些情况下都能用,但它们的语义和适用场景有重要区别。下面我详细解释一下:
1. 使用 == 判断 null
- == 是相等性比较运算符,用于检查两个操作数是否相等。
- 对于引用类型,== 默认比较的是引用是否相同(即两个变量是否指向同一个对象)。但当其中一个操作数是 null 时,它会检查变量是否未引用任何对象。
string str = null;
if (str == null)
{
Console.WriteLine("str 是 null");
}
- 优点:简洁、直观,是判断引用类型是否为 null 的标准做法。
- 注意:如果某个类型重载了 == 运算符,行为可能会改变,但大多数情况下(如 string),== null 的表现仍然符合预期。
- is 是类型检查或模式匹配运算符,在 C# 7.0 之后支持 is null 模式,用于判断一个表达式是否为 null。
string str = null;
if (str is null)
{
Console.WriteLine("str 是 null");
}
- 优点:
- 不会受到 == 运算符重载的影响,因此在某些边缘情况下更安全。
- 注意:is null 是编译时常量模式,性能上与 == null 几乎没有差别。
3. 两者的区别和选择建议
- 语义:
- == null:比较值是否相等,可能被类型重载影响。
- is null:纯粹检查是否为 null,无副作用。
- 适用场景:
- 如果你确定代码中不会涉及 == 运算符重载(例如处理 string 或普通引用类型),== null 是完全可以的,也是传统 C# 代码中最常见的写法。
- 如果你想确保代码在任何情况下都绝对可靠(比如处理自定义类型可能重载 == 的场景),推荐使用 is null,尤其是在现代 C# 项目中。
4. 推荐
- 日常使用:用 str == null,简单直观,符合大多数开发者的习惯。
- 现代代码或严格场景:用 str is null,更安全且更符合 C# 的演进方向(特别是在模式匹配的上下文中)。
5. 额外提示
- 如果你使用 C# 8.0 或更高版本,还可以用 null 合并运算符 (??) 或 null 条件运算符 (?.) 来简化 null 检查的逻辑。例如:
string str = null;
Console.WriteLine(str?.Length ?? 0);
总结来说,== null 和 is null 都可以用,但 推荐根据项目风格和需求选择一致的用法。如果你在写新代码,我个人更倾向于 is null,因为它更现代、更清晰。
阅读原文:原文链接
该文章在 2025/5/7 17:53:42 编辑过