当前位置: 首页 > news >正文

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

前言

在 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面试干货前往开源地址查看:

  • https://github.com/YSGStudyHards/DotNetGuide

image

image

 

http://www.rkmt.cn/news/60982.html

相关文章:

  • nestjs 使用类似midwayjs 模式加载模块
  • 2025年知名的高速注塑机TOP实力厂家推荐榜
  • 2025年比较好的塑料餐盒注塑机最新TOP厂家排名
  • 2025年比较好的基板Tray芯片载盘实力厂家TOP推荐榜
  • 2025年热门的SOP托盘芯片载盘厂家最新权威实力榜
  • 2025 年中国有机农场排名推荐榜:生态农业的典范与健康生活的源泉
  • 2025年比较好的新型建材最新TOP品牌厂家排行
  • 2025年质量好的实验室装修诚信推荐榜
  • .NET 10 社区SDK(Loongarch 和 RISC-V)
  • 2025 年 11 月管道更換服務廠家權威推薦榜:老舊破損/漏水無縫/防腐耐高溫/快速高效無損管道施工,全方位覆蓋家庭別墅工廠醫院學校室內室外管道更換需求
  • 2025铣床/立式铣床/摇臂铣床厂家推荐拓智者科技,精密高效加工首选
  • 智慧安全管理系统公司推荐,2025智慧安全管理系统公司权威榜
  • 目视化设计公司哪家好,2025目视化设计公司权威榜单
  • 水环真空泵哪家好?2025值得信赖水环真空泵厂家推荐
  • 铝合金重力铸造厂家哪家好?2025实力铝重力铸造厂家推荐榜单
  • 温州铝合金铸造厂哪家好?2025温州优质的铝铸造厂实力盘点
  • 2025电动刮刀过滤器生产厂家指南:实力刮刀过滤器定制厂家
  • 过滤器定制厂家哪家好?2025全自动吸吮式过滤器推荐厂家盘点
  • 小区绿化苗木公司哪家好?2025小区绿化苗木公司实力榜单
  • 绿化园林景观公司哪家好?2025绿化园林景观公司盘点
  • huggingface 仓库申请权限失败 (换 modelscope)
  • 2016-PTA初赛-L3-1 天梯地图(dijkstra模板)
  • KEYDIY Toyota 8A (BA) 4A All-Lost Adapter Cable: Simplify Key Replacement for Mechanics Car Owners
  • KEYDIY KD NB104 4-Button Universal Remote Key (5pcs) – Reliable Replacement for Euro/American Cars
  • 夺命雷公狗—好用的截图工具分享
  • 实验 3
  • 实验03
  • 2025年11月睫毛假发拉丝机,拉丝机,扫把丝拉丝机厂家权威推荐,细丝拉丝技术实力与口碑解析!
  • 2025年11月PE管材设备,PPR管材设备,PVC管材设备厂商推荐:聚焦管材机械企业综合实力与核心技术
  • 2025年11月PMMA板片生产线,EVA板片生产线,PET板片生产线厂家权威推荐,透明板材设备品质红榜发布!