C# null检查语法糖:从传统写法到??与?.详解

Owen
Owen
发布时间:2026-10-16| 6人浏览过
原创

在C#开发中,有效处理空值(null)是提升代码健壮性的关键。本文将详细解析C#提供的多种null检查工具,包括传统的条件判断、.NET 6推荐的ThrowIfNull方法,以及能显著简化业务逻辑的??、?.等语法糖,帮助开发者写出更简洁且安全的代码。

函数参数的null检查

在编写可复用函数时,对输入参数进行非空校验是防止运行时错误的标准动作。以下是几种常见的实现方式:

第1步:使用传统条件判断

这是最通用的做法,通过显式检查是否为null并抛出异常来确保安全性。

public static void GetV1(string prompt)
{
    if (prompt is null) throw new ArgumentNullException(nameof(prompt));
    Console.WriteLine(prompt);
}

第2步:使用.NET 6的ThrowIfNull

ArgumentNullException.ThrowIfNull方法自.NET 6起可用,它将检查与抛出异常的逻辑封装在一起,使代码更加紧凑和易读,无需手动实例化异常对象。

public static void GetV2(string prompt)
{
    ArgumentNullException.ThrowIfNull(prompt);
    Console.WriteLine(prompt);
}

当传递null时,该方法会直接抛出包含参数名的System.ArgumentNullException,执行效率与手动抛出一致,但写法更为优雅。

C# 11的!!参数特性(已撤销)

在C# 11的设计讨论中,曾短暂出现过!!后缀语法,旨在直接在参数声明处标记不可为空(如string prompt!!)。该设计意图是让编译器自动生成null检查代码。

虽然该特性最终因社区对语法复杂性的担忧及替代方案(如NRT Nullability类型注解)的存在而被撤回,但它反映了C#语言团队追求零样板代码的努力。即便未正式加入,了解此类设计有助于理解现代C#对空值处理的演进方向。

简化赋值逻辑的运算操作符

除了防御性编程中的参数检查,C#还提供了一系列操作符,极大地简化了变量初始化、默认值设置以及链式访问的逻辑。

第3步:利用??运算符提供默认值

当左侧表达式为null时,返回右侧表达式的值;否则返回左侧值。这在赋予变量默认值时非常高效。

int? a = null;
int b = a ?? -1; // b的值为-1

第4步:结合??=避免重复赋值

仅当左操作数为null时,才将右操作数的值赋给左变量。这比先判断后赋值的if语句更为精简。

int? a = null;
a ??= -1; // 如果a是null,则赋值为-1

第5步:安全调用?.运算符

对于可能为null的对象或集合,使用?.进行成员访问或索引。若主体为null,则整个表达式短路并返回null,而非抛出NullReferenceException。

using System;
public class C { public string Name = "Test"; }
C obj = null;
var result = obj?.Name; // result为null,程序不崩溃

第6步:注意链式调用的行为差异

在使用?.进行多层链式访问时,只要中间某一步为null,后续操作都不会执行,结果整体为null。然而,若在链外强行访问属性,则会触发异常。

string[] i = null;
// 输出null,不会报错,因为i?[1]为null,?.Substring被跳过
Console.WriteLine(i?[1]?.Substring(0).Length); 

// 抛出NullReferenceException,因为对null结果强行进行了.Length操作
Console.WriteLine((i?[1]?.Substring(0)).Length); 

实际应用场景速查对照

以下是常见开发场景中,传统写法与现代语法糖的对比优化建议:

  • 给参数设默认值:
    旧: if(x == null) x = "str";
    新: x ??= "str";
  • 三元表达式合并逻辑:
    旧:if(z != null) x = z; else x = "notnull";
    新: x = z ?? "notnull";
  • 安全访问字典值:
    旧:判断ContainsKey并在内部判空。
    新:使用 dict.TryGetValue(key, out var value) 配合 value ?? default。
  • 防止空指针执行:
    旧:if(obj != null) obj.Act();
    新: obj?.Act();

结语

C#提供了丰富的“语法糖”来处理null值,从直观的?安全导航到隐式的默认值合并??,这些特性让代码在保持高可读性的同时更具鲁棒性。掌握它们的区别与适用场景,能够有效减少冗余的条件判断,提升开发效率。

以上就是C#中检查null的语法糖与常用优化的详细内容,更多关于C#空值处理技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。