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#运算符? 和 ??内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Log4net进行日志记录

    使用Log4net进行日志记录

    本文详细讲解了使用Log4net进行日志记录的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 基于C#实现屏幕录制功能

    基于C#实现屏幕录制功能

    在许多应用场景中,屏幕录制是一项非常有用的功能,不管是用于教学、演示、故障排查还是游戏录制,本文将详细介绍如何使用 C# 实现屏幕录制功能,帮助大家快速掌握这一实用技能,需要的朋友可以参考下
    2025-03-03
  • C++实现日期类的示例详解

    C++实现日期类的示例详解

    这篇文章主要为大家详细介绍了四个C++常用的日期类的实现,文中的示例代码讲解详细,对我们学习C++有一定的帮助,需要的可以参考一下
    2023-02-02
  • 基于C#制作一个休息提醒闹钟的详细步骤

    基于C#制作一个休息提醒闹钟的详细步骤

    小闹钟大家都应该很熟悉,它包括时间、事件,当达到某某时间时,事件发生了,并且还有一个提示信息,下面这篇文章主要给大家介绍了关于如何基于C#制作一个休息提醒闹钟的详细步骤,需要的朋友可以参考下
    2023-02-02
  • 深入了解c#多线程编程

    深入了解c#多线程编程

    这篇文章主要介绍了c#多线程编程的相关资料,文中讲解非常细致,帮助大家更好的理解和学习c# 多线程,感兴趣的朋友可以了解下
    2020-08-08
  • C# 使用com获取Windows摄像头列表

    C# 使用com获取Windows摄像头列表

    本文主要介绍了C# 使用com获取Windows摄像头列表,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 基于WPF编写有趣的久坐提醒桌面小程序

    基于WPF编写有趣的久坐提醒桌面小程序

    这篇文章主要为大家详细介绍了如何基于WPF编写一个有趣的久坐提醒桌面小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下
    2023-08-08
  • 快速解决owin返回json字符串多带了双引号

    快速解决owin返回json字符串多带了双引号"多了重string转义字符串

    下面小编就为大家带来一篇快速解决owin返回json字符串多带了双引号"多了重string转义字符串。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • C#读取计算机CPU及HDD信息的方法

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

    这篇文章主要介绍了C#读取计算机CPU及HDD信息的方法,涉及C#读取计算机CPU及硬盘信息的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • c# 字符串操作总结

    c# 字符串操作总结

    这篇文章主要介绍了c# 字符串操作的相关知识,文中讲解的非常详细,代码帮助大家更好的学习,感兴趣的朋友可以参考下
    2020-06-06

最新评论