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
相关产品推荐
相关产品推荐

