讲师中心 微信公众号
AI工具推荐 视频效率加速

C# is not null模式匹配方法 C#如何简化null检查

千辰同学_4853

千辰同学_4853

发布时间:2026-02-02 04:19:34

|

1201人浏览过

|

来源于php中文网

原创

is not null 是 C# 8.0 起语义更清晰、支持流分析的 null 检查方式,优于 != null;适用于方法体内局部变量判断,可与类型模式组合用于 switch,但不能替代 ?? 或泛型约束。

c# is not null模式匹配方法 c#如何简化null检查

用 is not null 模式匹配替代传统 != null

从 C# 8.0 开始,is not null 是语义更清晰、编译器推断更友好的 null 检查方式。它不只是语法糖,还能触发可空引用类型(NRT)的流分析,让后续代码中变量的可空性状态被正确识别。

  • 写 if (obj is not null) 后,编译器知道 obj 在该分支内非空,不会报 CS8602(可能为 null 的解引用)
  • 相比 obj != null,它在模式匹配上下文中更自然,比如和 switch 或嵌套模式一起用
  • 注意:仅当项目启用 <nullable>enable</nullable> 且目标框架支持(.NET Core 3.0+ / .NET 5+)时,才能发挥完整效果

在 switch 中结合 is not null 做类型 + 非空联合判断

单独检查 null 很常见,但更多时候你真正想表达的是“如果是某个类型,且不为 null,就执行某逻辑”。这时候把 is not null 和类型模式组合起来,比先判空再强制转型更安全简洁。

object input = GetSomething();
switch (input)
{
    case string s when s.Length > 0: // s 已知非 null,Length 可直接调
        Console.WriteLine($"非空字符串: {s}");
        break;
    case int i:
        Console.WriteLine($"整数: {i}");
        break;
    case null: // 注意:null 是一个独立 case,必须显式写
        Console.WriteLine("输入为 null");
        break;
    default:
        Console.WriteLine("其他类型");
        break;
}
  • case string s 本身就隐含了非 null 判断(因为 string 是引用类型,模式匹配成功即表示非 null)
  • 如果写 case string? s,则 s 可能为 null,后续访问需再检查
  • case null 必须显式列出,否则 null 会掉进 default 分支

避免误用:别在泛型约束或属性初始化里硬套 is not null

is not null 是运行时模式匹配操作符,不能替代编译期约束或静态保证。强行在不合适的地方用,要么报错,要么失去意义。

Model Switcher
Model Switcher

根据任务复杂度自动切换不同的AI模型。支持OpenClaw设置中的所有可用模型。当检测到复杂...

下载
  • ❌ 不能用于泛型约束:where T : not null 是错误写法;正确是 where T : class(引用类型)或 where T : notnull(C# 9 新关键字,注意拼写是 notnull,无空格)
  • ❌ 不要在字段/属性初始化器中依赖它做非空保证:private readonly string _name = _input is not null ? _input.Name : "unknown"; —— 若 _input 是字段,初始化顺序可能导致未定义行为
  • ✅ 它最适合用在方法体内、明确有值可判断的局部变量或参数上

对比 ?? 和 is not null:用途完全不同

有人看到 is not null 就想替掉所有 null 合并操作符 ??,这是误解。两者解决的问题不在同一维度。

  • ?? 是提供默认值的表达式,关注“取什么”,例如:var name = user?.Name ?? "Anonymous"
  • is not null 是条件判断,关注“做什么”,例如:if (user is not null) { user.LogIn(); }
  • 混用反而啰嗦:if (user is not null) { Process(user); } 比 if (user != null) { Process(user); } 更推荐;但 user?.Name ?? "N/A" 绝对不该改成 (user is not null ? user.Name : "N/A") —— 前者简洁、短路、可读性强

真正容易被忽略的是:即使启用了可空引用类型,编译器也不会自动把 != null 升级为 is not null 的流分析能力。你得主动改写,并确保上下文中有足够的类型信息供编译器推理。

热门AI工具

更多
创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7239

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

1071

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

1437

2024.03.13

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

4456

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

326

2025.12.06

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

411

2026.03.13

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP基础入门课程
PHP基础入门课程

共33课时 | 3.5万人学习

前端系列快速入门课程
前端系列快速入门课程

共4课时 | 0.5万人学习

C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn