使用条件和空合并运算符

发布日期:2026-07-14 02:26:03   来源 : 杭州电子商务研究院    浏览量 :15
杭州电子商务研究院 发布日期:2026-07-14 02:26:03  
15

介绍

空值检查是开发高质量 C# 代码的重要部分。如果代码尝试访问空对象引用的成员,则会抛出 NullReferenceException 但是,使用if语句检查空引用会使代码更加冗长。

空合并和空条件运算符可以减少为避免NullReferenceException而需要编写的代码量。本文介绍如何使用这些运算符。

空值检查

考虑一下此代码。它抛出了一个NullReferenceException

      internal class Program
{
    private static void Main(string[] args)
    {
        Item item = null;
        Console.WriteLine($"Name: {item.Name}");
    }
}

internal class Item
{
    public string Name { get; }
}
    

为了修复此代码,我们可以添加一个if语句来检查是否为空。

      private static void Main(string[] args)
{
    Item item = null;

    if (item != null)
    {
        Console.WriteLine($"Name: {item.Name}");
    }
    else
    {
        Console.WriteLine($"Name: ");
    }
}
    

但是,上述代码增加了复杂性并创建了另一条代码路径。

空条件运算符

解决此问题的另一种方法是使用空条件运算符?

      private static void Main(string[] args)
{
    Item item = null;
    Console.WriteLine($"Name: {item?.Name}");
}
    

?右侧的部分仅在左侧部分不为空时才计算结果。否则,代码返回 null。因此,在上述情况下,item?.Name计算结果为 null,但不会引发异常,因为没有尝试访问 null 引用上的成员。对命名空间、类型、数组元素、访问方法的成员使用 null 条件运算符,或调用委托。

下面的类有两个方法会引发事件。如果没有附加事件处理程序,危险版本会引发NullReferenceException 。安全版本则不会。即使没有附加事件处理程序,调用该方法也始终是安全的。

      public class LongProcess
{
    public event EventHandler<string> Finished;

    public void FinishSafely()
    {
        Finished?.Invoke(this, "The process finished successfully");
    }

    public void FinishDangerously()
    {
        Finished.Invoke(this, "The process finished successfully");
    }
}
    

空合并运算符

??是空合并运算符。如果它不是空引用,则返回左侧部分的值。否则,返回右侧部分的值。使用此运算符可返回给定值。

如果语句可能返回 null,则可以使用 null 合并运算符来确保返回合理的值。此代码返回项目的名称,如果项目为 null ,则返回默认名称。如您所见,此运算符在使用 null 条件运算符时是一个方便的工具。

      private static void Main(string[] args)
{
    var defaultName = "Default";
    Item item = null;
    Console.WriteLine($"Name: {item?.Name ?? defaultName}");
    Console.ReadLine();
}
    

输出:

默认

从 C# 7 开始,可以使用空合并运算符来缩短参数验证。此类需要构造函数中的消息参数。在 C# 7 之前,验证需要if语句。

      internal class MessageProcessor
{
    private readonly string _Message;

    public MessageProcessor(string message)
    {
        if (message == null) throw new ArgumentNullException(nameof(message));
        _Message = message;
    }
}
    

使用空合并运算符可以将其缩短为下面的代码。

      internal class MessageProcessor
{
    private readonly string _Message;

    public MessageProcessor(string message)
    {
        _Message = message ?? throw new ArgumentNullException(nameof(message));
    }
}
    

结论

空值检查对于代码稳定性非常重要。空值条件运算符可用于简化空值检查。空值合并运算符是空值检查的一个很好的补充,可以进一步简化旨在返回非空值的代码。

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据