写点什么

C# 中 ?、??、??=、?: 、?. 、?[] 各种问号的用法和说明

作者:追逐时光者
  • 2025-11-26
    广东
  • 本文字数:2363 字

    阅读完需:约 8 分钟

前言

在 C# 中,问号(?)远不止是一个简单的标点符号。随着语言版本的迭代更新,C# 围绕问号(?)发展出了一套强大而优雅的空值处理和条件表达机制。熟练掌握这些操作运算符不仅能大幅提升代码的简洁性和可读性,还能有效避免恼人的空引用异常,构建更加健壮的应用程序。

可空类型修饰符(?)

在 C# 中,值类型(如 int、long、bool、DateTime 等)默认不能为 null。使用 ? 修饰符,我们可以将值类型转换为可空类型。

            int notNullableInt;// 非空int类型默认为 0            int? nullableInt = null;            bool? nullableBool = null;            long? nullableLong = null;            DateTime? nullableDate = null;
            // 检查是否有值            if (nullableInt.HasValue)            {                Console.WriteLine($"整数值: {nullableInt.Value}");            }            else            {                Console.WriteLine("变量没有值(为null)");            }
复制代码

Null 合并运算符(??)

Null 合并运算符(??)如果左边的值不为 null,则返回左边的值,否则返回右边的值。

        static void Main(string[] args)        {            string userName1 = "小明";            string userName2 = null;            var getUserName = userName1 ?? userName2 ?? "默认用户";
            Console.WriteLine(getUserName); // 输出: 小明
            string config1 = null;            string config2 = null;            string config3 = "DefaultConfig";            string finalConfig = config1 ?? config2 ?? config3 ?? "FallbackConfig";            Console.WriteLine(finalConfig); // 输出: DefaultConfig        }
复制代码

Null 合并赋值运算符(??=)

C# 8.0 引入的运算符,仅当左操作数为 null 时,才将右操作数的值赋给左操作数。这是懒加载模式的理想选择。

        static void Main(string[] args)        {            string? name = null;            name ??= "时光者";            Console.WriteLine(name); // 时光者
            name ??= "大姚"; // 不改变            Console.WriteLine(name); // 时光者

            //惰性初始化            Dictionary<string, string>? cache = null;
            cache ??= new Dictionary<string, string>();            cache["UserName"] = name;
            Console.WriteLine(cache["UserName"]);        }
复制代码

三元条件运算符(?:)

条件运算符(?:),又称三元运算符,是一种简洁的条件表达式形式。它对布尔表达式进行求值,并根据结果为 true 或 false,选择性地返回两个表达式中的对应结果,为简单条件判断提供了一种比传统 if-else 语句更紧凑、表达力更强的语法形式。

        static void Main(string[] args)        {            int score = 80;            string level = score >= 60 ? "Pass" : "Fail";            Console.WriteLine(level);        }
复制代码

Null 条件成员访问运算符 (?.)

Null 条件成员访问运算符 (?.) 在访问对象成员(属性、方法、字段等)前先检查对象是否为 null。如果对象为 null,整个表达式返回 null 而不会抛出 NullReferenceException;如果对象不为 null,则正常访问成员。

        static void Main(string[] args)        {            // 基本用法            Person person = null;            string name = person?.Name; // 不会抛出异常,name 为 null            Console.WriteLine(name ?? "name is null"); // 输出: name is null        }
复制代码

Null 条件索引访问运算符 (?[])

Null 条件索引访问运算符 (?[]) 在使用索引器访问集合元素前先检查集合对象是否为 null。如果集合为 null,整个表达式返回 null 而不会抛出异常;如果集合不为 null,则正常访问索引位置的元素。

        static void Main(string[] args)        {            List<string> names = null;            string firstName = names?[0]; // 不会抛出异常,firstName 为 null            Console.WriteLine(firstName ?? "No names available"); // 输出: No names available
            // 初始化列表后访问            names = new List<string> { "时光者", "小袁", "大姚" };            string secondName = names?[0]; // 安全访问索引为0的元素            Console.WriteLine(secondName); // 输出: 时光者        }
复制代码

C#/.NET/.NET Core 面试宝典

本文已收录至 C#/.NET/.NET Core 面试宝典中,更新 C#/.NET/.NET Core 面试干货前往开源地址查看:



发布于: 刚刚阅读数: 4
用户头像

不积跬步无以至千里,不积小流无以成江海! 2020-01-14 加入

微软MVP、华为云HCDE、华为云云享专家、51CTO专家博主、阿里云专家博主、博客园推荐博客、CSDN博客专家、腾讯云创作之星、掘金优秀创作者,一个热爱开源的全栈软件工程师,擅长C#、.NET、Vue等相关技术开发。

评论

发布
暂无评论
C# 中 ?、??、??=、?: 、?. 、?[] 各种问号的用法和说明_C#_追逐时光者_InfoQ写作社区