You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么引用类型需要支持可空特性?

你提到的string? nullableString是C# 8.0引入的可空引用类型特性,它和可空值类型解决的是完全不同的场景问题,存在的必要性主要有以下几点:

  • 解决传统引用类型的默认隐式空值风险

    在可空引用特性出现之前,所有引用类型的变量默认都允许赋值为null,编译器不会做任何前置检查。但实际业务开发中,90%以上的场景我们都希望引用类型变量不允许为空,这种默认设计导致NullReferenceException长期是.NET生态中出现频率最高的运行时异常。

  • 显式标注编码意图,将错误拦截在编译期
    开启可空引用检查规则后:
    • 普通string类型的变量会被编译器默认判定为不可为空,如果你尝试给它赋值null、或者未初始化就使用,编译器会直接抛出警告甚至编译错误。
    • 只有你显式声明为string?的变量,才被允许赋值为null,你在使用这类变量前,编译器也会强制要求你做空值判断,从根源上降低空引用异常的出现概率。
  • 提升代码可读性,降低协作成本
    其他开发者阅读代码时,只要看到?标记就能立刻知道该变量是预期可能为空的,不需要靠注释或者业务逻辑反向推断空值场景,也不用担心漏掉空判断导致线上故障。

举个实际的代码对比例子:

// 无可空引用类型的场景
public string GetUserName(int userId)
{
    // 查不到用户时会返回null,但调用方完全不知情,直接调用返回值的.Length属性就会触发空引用异常
    return userRepository.Find(userId)?.Name;
}

// 有可空引用类型的场景
public string? GetUserName(int userId)
{
    // 显式告知调用方返回值可能为空,调用方必须做空判断后才能使用返回值的类成员
    return userRepository.Find(userId)?.Name;
}

简单来说,可空值类型是给「原本不能为null的值类型」扩展了可以为空的能力,可空引用类型是给「原本默认可以为空的引用类型」增加了不可为空的约束,二者是互补的特性。

内容的提问来源于stack exchange,提问作者Monster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:15:03