可空类型与 null 安全
Nullable<T>/T?、可空引用类型(NRT)、null 包容符 !、??= 赋值
可空类型与 null 安全
C# 8.0 引入了可空引用类型(NRT)——编译器帮你追踪哪些引用可能为 null,从源头减少 NullReferenceException。
学完本章你将: 掌握 Nullable
可空值类型
csharp
int? age = null; // Nullable<int> 的简写
int? score = 42;
// 检查与取值
if (age.HasValue)
Console.WriteLine(age.Value);
// 简写
Console.WriteLine(age ?? 0); // null 时用 0
可空引用类型(C# 8+)
xml
<!-- 在 .csproj 中启用 -->
<Nullable>enable</Nullable>
csharp
// 启用 NRT 后:
string name = null; // ⚠️ 警告:不可为 null 的引用类型不能赋值 null
string? name2 = null; // ✅ 明确声明可为 null
// 使用时必须检查
void Print(string? text)
{
// Console.WriteLine(text.Length); // ⚠️ 警告:text 可能为 null
Console.WriteLine(text?.Length ?? 0); // ✅
}
null 包容符 !
csharp
// 当你确定某个值不为 null 但编译器不知道时
string? name = GetName();
// 告诉编译器:"我保证这里不是 null"
Console.WriteLine(name!.Length);
// 构造函数中常见
class Person
{
public string Name { get; set; } = null!; // 我知道会在构造后赋值
}
⚠️
!是绕过编译器检查——如果判断错误,运行时仍然会 NullReferenceException。只在百分百确定时使用。