C# 可空类型(Nullable)详解 在 C# 中**可空类型Nullable Types允许值类型Value Types**存储null值。在数据库开发、Web 开发以及企业级应用中非常常见。一、为什么需要可空类型普通值类型不能为null。例如int age null; // ❌ 编译错误因为intdoubleboolDateTime都属于值类型它们必须有一个值。但是现实开发中经常会出现用户年龄未知出生日期未知成绩未录入这些情况都需要一个没有值的状态。因此 C# 提供了 Nullable。二、Nullable 的写法有两种写法。第一种完整写法Nullableint age null;等价于Nullableint age 18;第二种推荐使用?int? age null;其实就是Nullableint的语法糖。例如double? price null; bool? result null; DateTime? birthday null;三、示例using System; class Program { static void Main() { int? age null; Console.WriteLine(age); } }输出什么也没有因为值就是 null。再赋值int? age 20; Console.WriteLine(age);输出20四、HasValue 属性判断是否有值。int? age null; Console.WriteLine(age.HasValue);输出False再看int? age 25; Console.WriteLine(age.HasValue);输出True五、Value 属性获取真正的值。int? age 25; Console.WriteLine(age.Value);输出25但是int? age null; Console.WriteLine(age.Value);运行结果System.InvalidOperationException Nullable object must have a value.所以不要在 HasValue 为 false 时访问 Value。正确写法if (age.HasValue) { Console.WriteLine(age.Value); }六、GetValueOrDefault()获取值。如果为空就返回默认值。int? age null; Console.WriteLine(age.GetValueOrDefault());输出0因为 int 默认值就是 0。也可以指定默认值Console.WriteLine(age.GetValueOrDefault(18));输出18七、空合并运算符 ??这是 Nullable 最常用的功能。int? age null; Console.WriteLine(age ?? 18);输出18意思如果左边不是 null返回左边如果左边是 null返回右边例如int? age 30; Console.WriteLine(age ?? 18);输出30八、空合并赋值 ??C# 8.0 新增。例如string name null; name ?? Tom; Console.WriteLine(name);输出Tom如果已经有值string name Jack; name ?? Tom; Console.WriteLine(name);输出Jack不会覆盖。九、空条件运算符 ?.用于防止空引用异常。例如Student stu null; Console.WriteLine(stu?.Name);不会报错。输出null如果不用Console.WriteLine(stu.Name);就会NullReferenceException十、可空类型之间运算int? a 10; int? b 20; Console.WriteLine(a b);输出30如果其中一个是 nullint? a null; int? b 20; Console.WriteLine(a b);输出结果也是 null。因为null 20 null十一、判断是否为空最简单if (age null) { Console.WriteLine(没有年龄); }或者if (age ! null) { Console.WriteLine(age); }也可以if (age.HasValue) { Console.WriteLine(age.Value); }十二、NullableT 常用成员成员作用HasValue是否有值Value获取值GetValueOrDefault()获取值没有则返回默认值GetValueOrDefault(x)没有值返回指定值十三、值类型与引用类型类型是否可为 nullint❌double❌bool❌DateTime❌int?✅double?✅bool?✅DateTime?✅string✅引用类型object✅引用类型补充C# 8.0虽然string本身可以为null但启用**可空引用类型Nullable Reference Types**后可以用string?明确表示允许为null而string表示不应为null编译器会提供相应的空值警告。这与int?可空值类型是不同的概念。十四、实际开发案例假设数据库中的年龄字段允许为空public class User { public string Name { get; set; } public int? Age { get; set; } }使用User user new User(); user.Name 张三; user.Age null; Console.WriteLine(user.Age ?? 18);输出18表示如果数据库没有年龄就默认显示 18。十五、最佳实践优先使用T?如int?、DateTime?代码更简洁。读取值前先判断HasValue或使用??提供默认值避免直接访问Value。数据库字段可为空时实体类对应属性应使用可空值类型。区分两类可空int?可空值类型Nullableint。string?可空引用类型C# 8.0 的编译器空值分析。十六、小结语法说明int? age声明可空整型Nullableintint?的完整写法HasValue判断是否有值Value获取值需确保不为nullGetValueOrDefault()获取值或类型默认值GetValueOrDefault(x)获取值或指定默认值??空合并运算符提供默认值??空合并赋值仅在为空时赋值?.空条件运算符避免空引用异常

相关新闻

最新新闻

Blender洗衣机产品动画全流程:从场景搭建到批量渲染

Blender洗衣机产品动画全流程:从场景搭建到批量渲染

这次我们来看一个动态设计项目:给瑞士品牌 Schulthess 洗衣机做一套可循环使用的产品动态视觉。它不是一张静态海报,而是让滚筒、内筒、水流、泡沫、门圈反光和镜头全部动起来,最终输出 4K 序列帧和一份可以发给客户的预览视频。这类项目的关…

2026/8/27 20:48:43
线性规划与分支定界算法在金融风控信用评分卡优化中的应用

线性规划与分支定界算法在金融风控信用评分卡优化中的应用

1. 项目概述:当数学建模遇上金融风控 去年带学生打MathorCup,A题“信用评分卡优化”一出来,我们团队就意识到,这绝不是一个简单的套模型题。它本质上是一个典型的、在强约束下的资源分配与决策优化问题。题目要求我们基于给定的客…

2026/8/27 20:48:43
LT8580多拓扑电源设计:Boost/SEPIC/Inverting实战解析

LT8580多拓扑电源设计:Boost/SEPIC/Inverting实战解析

去年做一块车载传感器采集板时,我碰上一个挺磨人的供电问题:板上只有一路5V输入,却要同时给运放供12V、给继电器驱动供12V。按老套路,至少得塞两路DCDC,再加一路负压发生器,板面积和成本都压不住。后来翻到…

2026/8/27 20:48:43
动态规划核心实现:备忘录法与自底向上法详解与实战

动态规划核心实现:备忘录法与自底向上法详解与实战

1. 项目概述:从“暴力”到“优雅”的必经之路如果你刷过算法题,或者在工作中处理过复杂的优化问题,那么“动态规划”这四个字对你来说,一定不陌生,甚至可能带着一丝又爱又恨的情绪。爱的是,它确实能解决那些…

2026/8/27 20:48:43
基于SpringBoot和Vue的物流管理系统设计与实现(毕业设计项目源码+文档)

基于SpringBoot和Vue的物流管理系统设计与实现(毕业设计项目源码+文档)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/27 20:48:43
元初混沌体系 第三卷 卫星互联网全域周天拓扑体系:第四十篇 低轨跨区域数据中转最优路由拓扑

元初混沌体系 第三卷 卫星互联网全域周天拓扑体系:第四十篇 低轨跨区域数据中转最优路由拓扑

第四十篇 低轨跨区域数据中转最优路由拓扑承启前置 方案立论第三十九篇已完成中轨环形周天骨干链路全网贯通模型体系定型,构建起同轨闭环、跨轨贯通、长距直达、自愈均衡的天基全域骨干传输主干,彻底解决了中轨圈层传输无序、链路断点、带宽失衡、故障扩…

2026/8/27 20:43:43