You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中is not null与!= null除语法外还有哪些区别?

随着C# 9.0版本发布,negated null constant(否定空常量)模式被正式引入。

模式匹配(pattern matching)官方文档指出:

从C# 9.0开始,你可以使用否定空常量模式执行非空检查,示例如下:

if (e is not null)
{
    // ...
}

除了语法差异之外,e is not null和e != null两种空值判断的核心区别如下:

  • 是否遵循运算符重载逻辑:!=是支持自定义重载的运算符,若某自定义类型重写了不等运算符的实现逻辑,e != null会执行这套自定义判断规则,结果可能和变量实际的运行时空状态不一致;而is not null属于模式匹配语法,完全忽略任何运算符重载,只会严格校验变量的运行时引用本身是否为null,判断结果稳定无额外副作用。
  • 编译器可空流分析支持度不同:针对C# 8.0引入的可空引用类型(NRT)特性,is not null的判断结果会被编译器的流分析完全识别,只要判断通过,后续该变量会被自动标记为非空,不会触发不必要的可空警告;而!= null在部分复杂场景下(比如变量为泛型类型、判断逻辑和其他条件组合时),编译器可能无法正确推导变量的非空状态,仍会抛出可空警告。
  • 模式扩展能力不同:is not null可以直接和其他模式(关系模式、属性模式、位置模式等)串联组合,比如可以直接写if (user is not null { Age: > 18 })同时完成非空判断和属性校验,语法更简洁连贯;而!= null只能单独完成空校验,和其他判断逻辑组合需要额外加&&运算符拼接,写法更繁琐。
  • 动态类型场景行为不同:如果变量是dynamic类型,e != null会触发动态运行时绑定,存在额外性能开销,甚至可能因为动态类型的自定义逻辑抛出异常;而e is not null不会走动态绑定流程,直接判断引用本身是否为null,性能更稳定,也不会触发额外的动态逻辑。

内容的提问来源于stack exchange,提问作者Pawel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 10:18:02