C# 中的空传播运算符

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

介绍

早在 2016 年,微软就举办了一场名为 Visual Studio Connect() 的活动,并在会上发布了 Visual Studio 2015 和 C# 6.0 的预览版。这个新版本融合了开发人员和当时技术所需的许多变化。

以下仅列举几个新功能:

  1. 只读自动属性
  2. 自动属性初始化器
  3. 表达式体函数成员
  4. 使用静态
  5. 空条件运算符

完整列表请参见此处

在本指南中,我们将介绍空条件运算符,通常称为空传播运算符。也有人将此功能称为安全导航运算符

运营商

为了便于理解,我们需要介绍两个新的运算符。这些运算符的主要目标是使代码执行更加流畅,并用有意义的错误处理取代NullReferenceException 。

  1. ?.- > 称为成员访问运算符
  2. ?[] -> 称为元素访问运算符

让我们看一个成员访问运算符的示例。在 C# 之前,以下代码会导致System.NullReferenceException:“未将对象引用设置为对象的实例。”

      using System;
namespace Pluralsight
{
    public class NullProp
    {
        public static void Main()
        {
            Server DC = new Server();
            Console.WriteLine(DC.name.Length);
            Console.ReadKey();
        }
        class Server
        {
            public string name { get; set; }
        }
    }
}
    

这里的问题是我们想要检查从未初始化的属性的长度,这会引发异常。

处理此问题的一种方法是对代码进行以下修改。我们想将关键代码包装在try - catch块中以查找空引用。

      try 
    { Console.WriteLine(DC.name.Length); }
catch(System.NullReferenceException)
    { Console.WriteLine("The name is not initialized."); }
    

这给了我们以下输出。

      The name is not initialized.
    

这似乎可以解决问题,但是,我们需要按如下方式修改代码。

      Console.WriteLine(DC?.name ?? "No Name provided yet!");
    

如果我们不事先初始化name属性,我们将得到以下输出。

      No Name provided yet!
    

这为我们节省了try - catch块并减少了代码长度。??运算符称为空合并运算符,它允许我们编写条件表达式,当表达式计算结果为空时返回默认值。? .可用于以线程安全的方式调用委托,这有助于开发多线程应用程序。

注:这位操作员的昵称是“猫王操作员”。

让我们看一个元素访问运算符的示例。我们想将上面的代码修改如下。

      using System;
namespace Pluralsight
{
    public class NullProp
    {
        public static void Main()
        {
            Server[] servers = new Server[5];
            Server S1 = new Server();
            S1.name = "First";
            Server S2 = new Server();
            S2.name = "Second";
            Server S3 = new Server();            
            Server S4 = new Server();
            S4.name = "First";
            Server S5 = new Server();
            servers[0] = S1;
            servers[1] = S2;
            servers[2] = S3;
            servers[3] = S4;
            servers[4] = S5;
            foreach(Server s in servers)
            {
                Console.WriteLine(s?.name ?? "No Name specified!");
            }
            Console.ReadKey();
        }
        class Server
        {
            public string name { get; set; }
        }
    }
}
    

我们需要一个包含五个元素的数组。这个数组将填充服务器,并且一些服务器的名称属性将被初始化。然后我们迭代服务器并使用成员访问运算符检查服务器的名称是否已初始化。好的,现在您可能想知道元素访问运算符的演示在哪里。 for 循环可以轻松转换为此类型。

      for(int i = 0; i < 5; i++)
{
    Console.WriteLine(servers?[i].name ?? "No name was specified!");
}
    

我们甚至可以通过这种方式组合元素和成员访问运算符。

      for(int i = 0; i < 5; i++)
{
    Console.WriteLine(servers?[i]?.name ?? "No name was specified!");
}
    

当我们执行代码时会产生以下输出。

      # first for loop
First
Second
No Name specified!
First
No Name specified!
# second for loop
First
Second
No name was specified!
First
No name was specified!
    

结论

空值传播运算符代表了一个断点,它为 C# 编程语言带来了弹性。它允许您以更优雅的方式处理 System.NullReferenceException异常。它还减少了需要编写的代码行数,并帮助您避免以后出现错误。总而言之,它使代码更简洁,更易于维护。我希望这对您有所帮助,并感谢您阅读它。

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