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

C# 中的问号(?)与双问号(??)运算符详解

@[TOC](C# 中的问号(?)与双问号(??)运算符详解)

1. 问号(?):可空类型声明

在 C# 中,问号(?)用于声明可空类型(Nullable Types),表示该变量可以存储null值。

1.1 基本语法

int?a=newint?();Console.WriteLine(a);// 输出:null

1.2 等价写法

上述声明等价于:

int?a=null;

也等价于:

int?a;// 声明可空整型变量,默认值为 null

1.3 使用场景

可空类型主要用于值类型(如intfloatdouble等),允许它们像引用类型一样接受null值。这在数据库操作、API 响应处理等场景中非常有用。

2. 双问号(??):空值合并运算符

双问号(??)是 C# 中的空值合并运算符(Null-coalescing operator),用于简化null值检查。

2.1 基本语法

c=a??b;

2.2 等价写法

上述表达式等价于:

c=(a==null)?b:a;

2.3 使用规则与注意事项

规则 1:类型一致性要求

ab必须是相同类型,且a必须是可以为null的类型:

  • 引用类型(如objectstring等)
  • 可空值类型(如int?float?double?等)
  • dynamic动态类型

正确示例 1:引用类型

// 例1:a,b 同为引用类型,a 可以为空objecta=null;objectb=10;objectc=a??b;// a,b,c 的类型相同

正确示例 2:可空值类型

// 例2:a,b 同类型,a 为可空类型int?a=null;intb=10;intc=a??b;// 或者进行隐式转换floatc=a??b;// a??b 表达式的值为 int 型,隐式转换为 float 型

错误示例:类型不匹配

// 例3:a,b 是不同类型,编译报错int?a=null;stringb="hello";stringc=a??b;// 错误:运算符"??"无法应用于"int?"和"string"类型的操作数
规则 2:表达式类型与赋值兼容性

a ?? b表达式的值类型与ab相同,因此:

  • c必须与ab同类型,或者
  • a ?? b表达式的值进行隐式转换或强制类型转换

正确示例:类型转换

// 示例 1:转换为字符串int?a=null;intb=10;stringc=(a??b).ToString();// 示例 2:强制类型转换objecta=null;objectb=10;intc=(int)(a??b);

2.4 链式使用

双问号运算符支持链式调用,这在处理多层可能为null的值时非常方便:

stringresult=value1??value2??value3??"默认值";

3. 实际应用场景

3.1 数据库字段处理

int?ageFromDb=GetAgeFromDatabase();// 可能返回 nullintage=ageFromDb??0;// 如果为 null,则使用默认值 0

3.2 配置项读取

stringconnectionString=ConfigurationManager.AppSettings["ConnectionString"]??"DefaultConnectionString";

3.3 方法参数默认值

publicvoidProcessData(stringdata,string?fallback=null){stringactualData=data??fallback??"默认数据";// 处理 actualData}

4. 总结

运算符名称用途示例
?可空类型修饰符声明值类型变量可以存储nullint? age = null;
??空值合并运算符提供null时的默认值string name = input ?? "匿名";

关键要点:

  1. 问号(?):让值类型具备存储null的能力
  2. 双问号(??):简化null检查,提供优雅的默认值处理
  3. 类型安全:使用??时需确保操作数类型兼容
  4. 链式调用??支持多级空值检查,代码更简洁

掌握这两个运算符能显著提升 C# 代码的健壮性和可读性,特别是在处理可能缺失的数据时。

http://www.jsqmd.com/news/1315290/

相关文章:

  • 2026年8月|深圳龙岗好口碑驾校TOP3推荐 - 趣闻早乐评
  • 北京公司合同纠纷律师选择:诉讼策略制定与证据组织能力的评估 - 品牌深度评测
  • Unity3D毕业设计实战:从选题到交付的产品化开发指南
  • SPI接口原理以及读写接口用例的详细介绍
  • 如何使用Kronos金融基础模型在5分钟内实现精准市场预测
  • 终极网页时光机:5分钟学会如何永久保存任何网页内容
  • Godot引擎塔防游戏开发:数据驱动设计与性能优化实战
  • Unity游戏开发:从UGUI基础到高级血条系统实现与优化
  • NoFences开源桌面分区管理工具:终极免费替代方案告别杂乱桌面
  • AI认知水平评估新范式(2024实证版):基于127项神经符号测试的分级认证体系首次公开
  • Blender到Unity模型旋转错乱:坐标系差异与FBX导出终极解决方案
  • 中山优才教育:河源大数据技术应用工程师报名入口、条件与流程详解 - 学历提升热点资讯
  • 3分钟掌握无损歌词下载:163MusicLyrics歌词获取终极指南
  • 北京企业合同管理体系搭建:从审批流程到归档制度的合规设计 - 品牌深度评测
  • Github上传代码/删除仓库/新建分支的操作流程记录
  • 超级完整的 Git的下载、安装、配置与使用 以及命令
  • 光照章节学习
  • 终极Switch离线影音方案:wiliwili本地播放完整配置指南
  • Android 图形架构 之六——深入分析draw()是如何工作的
  • 学术海报制作的智能革命:如何让AI在5分钟内完成你8小时的工作
  • 2026家具封边机选购指南:S700S怎么选 - 趣闻早乐评
  • 小说下载器终极指南:一键保存200+网站小说到本地
  • 推荐全国值得信赖的混凝土防碳化涂料生产厂:2026年优选 - 品牌推广大师
  • 揭秘CS2_External:一款学习游戏逆向工程的绝佳开源项目
  • Godot游戏资源解包指南:三步提取.pck文件素材
  • PTA 交换最小值和最大值 (15 分)
  • 北京企业合同审查律师选聘:专注商事合同领域的实务经验考察 - 品牌深度评测
  • DirectShow图像处理实战:从Filter Graph架构到实时边缘检测实现
  • 龙岗区:排钻碎钻手链钻戒回收避坑!为什么你的碎钻总被低价收? - 大牌深度测评
  • 手写一个 RAG:从零搭建可溯源的检索增强问答系统