尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C# 可空类型(Nullable)详解

C# 可空类型(Nullable)详解
📅 发布时间:2026/7/7 18:43:22

在 C# 中,**可空类型(Nullable Types)允许值类型(Value Types)**存储null值。在数据库开发、Web 开发以及企业级应用中非常常见。


一、为什么需要可空类型?

普通值类型不能为null。

例如:

int age = null; // ❌ 编译错误

因为:

  • int
  • double
  • bool
  • DateTime

都属于值类型,它们必须有一个值。

但是现实开发中,经常会出现:

  • 用户年龄未知
  • 出生日期未知
  • 成绩未录入

这些情况都需要一个"没有值"的状态。

因此 C# 提供了 Nullable。


二、Nullable 的写法

有两种写法。

第一种(完整写法)

Nullable<int> age = null;

等价于

Nullable<int> age = 18;

第二种(推荐)

使用?

int? age = null;

其实就是:

Nullable<int>

的语法糖。

例如:

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

如果其中一个是 null:

int? 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); }

十二、Nullable<T> 常用成员

成员作用
HasValue是否有值
Value获取值
GetValueOrDefault()获取值,没有则返回默认值
GetValueOrDefault(x)没有值返回指定值

十三、值类型与引用类型

类型是否可为 null
int❌
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?:可空值类型(Nullable<int>)。
    • string?:可空引用类型(C# 8.0+ 的编译器空值分析)。

十六、小结

语法说明
int? age声明可空整型
Nullable<int>int?的完整写法
HasValue判断是否有值
Value获取值(需确保不为null)
GetValueOrDefault()获取值或类型默认值
GetValueOrDefault(x)获取值或指定默认值
??空合并运算符,提供默认值
??=空合并赋值,仅在为空时赋值
?.空条件运算符,避免空引用异常

相关新闻

  • Android 开发问题:EmbossMaskFilter 浮雕效果不生效
  • 如何用Buzz实现离线音频转文字:新手的完整入门指南
  • 鸿蒙应用SM2国密算法实践:加密签名完整实现与踩坑指南

最新新闻

  • Discuz! X3.4 升级模块远程代码执行漏洞复现:3步利用与1行代码加固
  • 渗透测试深度信息收集:从被动侦察到主动测绘的全流程实战
  • 5分钟上手B站智能弹幕机器人:打造24小时自动化直播间
  • LoadRunner社区版免费安装与性能测试入门实战指南
  • TCExam在线考试系统终极指南:从零搭建专业级考试平台的完整教程
  • SQLmap渗透测试工具:从环境搭建到实战注入检测与数据提取

日新闻

  • Android逆向分析全能助手:集成化工具链与自动化工作流设计
  • 面搜索(Faceted Search)原理与工程实践指南
  • 神经网络调参避坑指南:从5个常见Loss曲线形态定位超参数问题

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号