Z
ZHANK
编程在线教程C# 教程可空类型与 null 安全
入门基础

可空类型与 null 安全

Nullable<T>/T?、可空引用类型(NRT)、null 包容符 !、??= 赋值

可空类型与 null 安全

C# 8.0 引入了可空引用类型(NRT)——编译器帮你追踪哪些引用可能为 null,从源头减少 NullReferenceException。

学完本章你将: 掌握 Nullable/T?、NRT 启用、null 包容符 !。


可空值类型

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。只在百分百确定时使用。