可空引用类型

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); // 输出:未知用户