可空引用类型
C# 8.0 引入的"编译时防呆机制"。给引用类型(string、class 等)贴上标签:
string = 不可空,必须有值,赋 null 编译器会警告你
string? = 可空,允许为 null,使用时编译器会提醒你做检查
注意:这是编译时检查(写代码时 IDE 标黄线),不是运行时特性。目的是帮你提前发现"空引用异常"。
——————————————————————————————————————————————————————————————————————————
如何开启?
在代码文件最顶部加一行:
nullable enable
——————————————————————————————————————————————————————————————————————————
案例 1:变量声明 —— 贴标签防呆
csharp
nullable enable
string name = "张三"; // 不可空:必须有值
string? nickname = null; // 可空:允许为 null
// name = null; // ❌ 编译警告:不能给不可空变量赋 null
Console.WriteLine(nickname ?? "无昵称"); // 输出:无昵称
——————————————————————————————————————————————————————————————————————————
案例 2:方法参数 —— 调用前就知道能不能传 null
nullable enable
void SayHello(string name) // 参数不可空:调用时必须传值
{
Console.WriteLine($"你好,{name}");
}
void Log(string? message) // 参数可空:调用时可以传 null
{
Console.WriteLine(message ?? "(无日志)");
}
SayHello("张三"); // ✅
// SayHello(null); // ❌ 编译警告!
Log(null); // ✅ 允许
——————————————————————————————————————————————————————————————————————————
案例 3:返回值 —— 调用方知道可能拿到 null
nullable enable
string? FindUser(int id) // 返回值可能为 null
{
return id == 1 ? "张三" : null;
}
string user = FindUser(2) ?? "未知用户"; // 用 ?? 兜底,防止 null
Console.WriteLine(user); // 输出:未知用户