空引用体系:如何写更稳的 C# 代码

发布时间:2026/6/9 19:27:22

空引用体系:如何写更稳的 C# 代码 在 C# 开发中,NullReferenceException(空引用异常)几乎是每个开发者都会遇到的问题。Object reference notsetto an instance of an object.很多线上 Bug、本地调试崩溃、接口调用异常,最后都能追溯到:“某个对象居然是 null。”而从 C# 8 开始,微软正式引入了:Nullable Reference Types(可空引用类型)它的目标非常明确:让 “空引用风险” 从运行时问题,提前变成编译期问题。这篇文章会循序渐进地讲清楚:什么是空引用体系为什么以前的代码容易崩?到底是什么意思如何逐步写出“更稳”的代码在真实项目中如何实践常见误区最后附带练习题一、为什么空引用问题这么常见?先看一个传统代码:publicclassUser { publicstringName {get;set; } } varuser = GetUser(); Console.WriteLine(user.Name.Length);问题在哪里?你会发现:user可能是 nulluser.Name也可能是 null但编译器:完全不提醒你。于是运行时:NullReferenceException就来了。二、传统 C# 的问题:引用类型默认可空在旧版本 C# 中:stringname =null; User user =null;这是合法的。因为:所有引用类型默认都允许 null。也就是说:类型是否可为 nullint❌int?✅string✅(旧时代)User✅(旧时代)这会导致一个问题:编译器根本不知道:哪些对象应该为空哪些对象不应该为空于是只能全部放行。三、Nullable Reference Types 到底是什么?从 C# 8 开始:微软重新定义了引用类型。开启后:string表示:不允许为 null而:string?表示:允许为 null这和int?的思想终于统一了。四、如何开启 Nullable Reference Types在.csproj中:Nullableenable/Nullable或者:Nullableannotations/Nullable一般推荐:Nullableenable/Nullable开启后:编译器会开始分析你的 null 风险。五、第一个变化:编译器开始“唠叨”例如:stringname =null;现在:编译器警告:Cannot convert null literal to non-nullable referencetype.因为:string现在意味着:“我保证它不为空。”六、真正的核心:空引用流分析(Flow Analysis)这是 Nullable Reference Types 最强大的地方。例如:string? name = GetName(); Console.WriteLine(name.Length);编译器会警告:Dereference of a possibly null reference.因为name可能为空。但如果你做了判空:if(name !=null) { Console.WriteLine(name.Length); }警告消失。因为编译器进行了:流分析(Flow Analysis)它能推断:进入 if 后,name 一定不为空。七、理解 “可空” 与 “不可空”这是最重要的认知。不可空引用stringname含义:调用方保证不为空。这是“契约”。可空引用string? name含义:调用方必须考虑 null 情况。

相关新闻