C#中的? 和 ??运算符使用详解

 更新时间:2026年02月02日 09:32:28   作者:Yashar Qian  
C#中的?(null条件运算符)和??(null合并运算符)用于简化null值检查和处理,?运算符在访问成员或元素前检查对象是否为null,而??运算符在左侧表达式为null时返回右侧的值,这两个运算符可以大大减少代码中的null检查样板代码,本文给大家介绍的非常详细

在 C# 中,?(null 条件运算符)和 ??(null 合并运算符)是两个非常有用的运算符,用于简化 null 值检查和处理。

1.?(Null 条件运算符)

? 运算符用于在访问成员或元素之前检查对象是否为 null。如果对象为 null,则返回 null 而不抛出异常。

基本用法

string name = person?.Name;
// 等同于
string name = (person != null) ? person.Name : null;

链式调用

int? length = people?.FirstOrDefault()?.Name?.Length;

方法调用

person?.PrintName(); // 如果 person 为 null,则不执行方法

数组/集合访问

int? firstItem = array?[0];

2.??(Null 合并运算符)

?? 运算符用于在左侧表达式为 null 时返回右侧的值。

基本用法

string displayName = name ?? "匿名用户";
// 等同于
string displayName = (name != null) ? name : "匿名用户";

与?结合使用

string name = person?.Name ?? "未知";

链式使用

string configValue = config?.Settings?.Value ?? "默认值";

3.??=(C# 8.0 引入的 Null 合并赋值运算符)

name ??= "默认值";
// 等同于
if (name == null)
{
    name = "默认值";
}

实际应用示例

class Program
{
    static void Main()
    {
        Person person = null;
        
        // 使用 ?. 避免 NullReferenceException
        string name = person?.Name;
        Console.WriteLine(name); // 输出 null
        
        // 使用 ?? 提供默认值
        string safeName = person?.Name ?? "无名氏";
        Console.WriteLine(safeName); // 输出 "无名氏"
        
        // 复杂示例
        int? age = person?.Age ?? 18;
        Console.WriteLine(age); // 输出 18
        
        // ??= 运算符
        string nickname = null;
        nickname ??= "小新";
        Console.WriteLine(nickname); // 输出 "小新"
    }
}

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

注意事项

  1. ? 运算符会改变表达式的类型,使其变为可空类型
  2. ?? 右侧的表达式只有在左侧为 null 时才会计算
  3. 这些运算符可以大大减少代码中的 null 检查样板代码
  4. 在性能关键路径上,? 比手动 null 检查有轻微开销

这两个运算符是现代 C# 编程中处理 null 值的推荐方式,可以使代码更简洁、更安全。

到此这篇关于C#中的? 和 ??运算符详解的文章就介绍到这了,更多相关C#运算符? 和 ??内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c# mutex互斥量的深入解析

    c# mutex互斥量的深入解析

    本篇文章主要是对c#中的mutex互斥量进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • C#逐行读取文本文件的几种有效方法

    C#逐行读取文本文件的几种有效方法

    在C#中,我们可以使用各种方法来读取和写入文本文件,本文主要给大家介绍了C#逐行读取文本文件的几种有效方法,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2025-01-01
  • 清除aspx页面缓存的程序实现方法

    清除aspx页面缓存的程序实现方法

    这篇文章主要介绍了清除aspx页面缓存的程序实现方法,非常实用,需要的朋友可以参考下
    2014-08-08
  • C# 注册表 操作实现代码

    C# 注册表 操作实现代码

    Windows 操作系统的注册表包含了很多有关计算机运行的配置方式,打开注册表我们可以看到注册表是按类似于目录的树结构组织的
    2009-07-07
  • C#读取计算机CPU及HDD信息的方法

    C#读取计算机CPU及HDD信息的方法

    这篇文章主要介绍了C#读取计算机CPU及HDD信息的方法,涉及C#读取计算机CPU及硬盘信息的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#使用Spire.PDF for .NET实现PDF转SVG

    C#使用Spire.PDF for .NET实现PDF转SVG

    在现代Web开发和图形处理中,对于文档和图像格式的灵活转换需求日益增长,本文将深入探讨如何利用强大的 Spire.PDF for .NET 库,准确地将PDF文件转换为SVG文件,感兴趣的小伙伴可以了解下
    2025-09-09
  • 利用unity代码C#封装为dll的步骤分享

    利用unity代码C#封装为dll的步骤分享

    这篇文章主要给大家介绍了关于利用unity代码C#封装为dll的相关资料,文中通过图文将实现的方法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • C#排序算法之快速排序

    C#排序算法之快速排序

    下面给出的代码是以数组最后一个元素作为参考元素,这仅是参考元素选取的方式之一。
    2010-09-09
  • C# xml序列化实现及遇到的坑

    C# xml序列化实现及遇到的坑

    在C#中,当我们需要将对象存储到文件或通过网络发送时,我们可以使用XML序列化将C#对象转换为XML文档,以便于存储、传输和还原,本文主要介绍了C# xml序列化实现及遇到的坑,感兴趣的可以了解一下
    2023-09-09
  • C# 装箱和拆箱的知识回顾

    C# 装箱和拆箱的知识回顾

    本篇文章主要介绍了C#的装箱和拆箱的知识点回顾,对大家的学习和复习具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12

最新评论