LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

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.");



那么到底该如何判断引用是否为null?

在 C# 中,判断引用类型是否为 null 时,通常使用 == 运算符,而不是 is。这两种方式在某些情况下都能用,但它们的语义和适用场景有重要区别。下面我详细解释一下:

1. 使用 == 判断 null

  • == 是相等性比较运算符,用于检查两个操作数是否相等。
  • 对于引用类型,== 默认比较的是引用是否相同(即两个变量是否指向同一个对象)。但当其中一个操作数是 null 时,它会检查变量是否未引用任何对象。
  • 示例:

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

  • 优点:简洁、直观,是判断引用类型是否为 null 的标准做法。
  • 注意:如果某个类型重载了 == 运算符,行为可能会改变,但大多数情况下(如 string),== null 的表现仍然符合预期。


2. 使用 is 判断 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); // 输出 0

总结来说,== null 和 is null 都可以用,但 推荐根据项目风格和需求选择一致的用法。如果你在写新代码,我个人更倾向于 is null,因为它更现代、更清晰。


阅读原文:原文链接


该文章在 2025/5/7 17:53:42 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved