C# 可空类型 - CSHARP教程

C# 可空类型(Nullable)

可空类型就是允许值类型(如 int、bool、DateTime)可以有一个没有值的状态(即 null)。

在 C# 中,像 int、float、bool 等都是值类型(Value Types),默认情况下它们不能为 null。

例如以下赋值就会编译错误:

int a = null;  // 编译错误

但是使用 可空类型之后就可以:


int? a = null;  // 合法

这时 a 的类型其实是:


Nullable<int>

int? 是 Nullable<int> 的语法糖(简写形式)。

单问号 ? 与双问号 ?? 的区别

运算符 名称 用途 示例
? 可空类型标识符 让值类型可以为 null int? i = 3; 等价于 Nullable<int> i = new Nullable<int>(3);
?? 空合并运算符(Null-Coalescing Operator) 当变量为 null 时提供默认值 int result = i ?? 0;

例如:

int i;     // 默认值为 0

int? ii;   // 默认值为 null

C# 可空类型(Nullable)

C# 提供了一个特殊的数据类型: nullable 类型(可空类型)

可空类型可以表示其基础值类型的正常范围内的值,再加上一个 null 值。

例如:

Nullable<int> x = null;       // 可空的 Int32

Nullable<bool> flag = true;   // 可空的布尔

Nullable<Int32> 变量可以被赋值为:

  • -2,147,483,648 ~ 2,147,483,647 之间的任意整数;
  • 或者 null

类似地, Nullable<bool> 可以被赋值为:

  • true
  • false
  • null

可空类型的声明语法

<data_type>? <variable_name> = null;

例如:

int? age = null;

double? temperature = 36.6;

bool? isActive = new bool?();

下面的实例演示了可空数据类型的用法:

示例代码
usingSystem;namespaceCalculatorApplication{classNullablesAtShow{staticvoidMain(string[]args){int?num1=null;int?num2=45;double?num3=newdouble?();double?num4=3.14157;bool?boolval=newbool?();// 显示值Console.WriteLine("显示可空类型的值: {0}, {1}, {2}, {3}",num1, num2, num3, num4);Console.WriteLine("一个可空的布尔值: {0}", boolval);Console.ReadLine();}}}

当上面的代码被编译和执行时,它会产生下列结果:


显示可空类型的值: , 45,  , 3.14157

一个可空的布尔值:

Null 合并运算符( ?? )

空合并运算符(??)用于为 可空类型 或 引用类型 定义一个默认值。

当左侧的值为 null 时,?? 返回右侧的默认值。

基本语法:

<表达式1> ?? <表达式2>

说明:

  • 如果 <表达式1> 不为 null,返回 <表达式1>
  • 否则返回 <表达式2>
示例代码
usingSystem;namespaceCalculatorApplication{classNullablesAtShow{staticvoidMain(string[]args){double?num1=null;double?num2=3.14157;doublenum3;num3=num1??5.34;// num1 如果为空值则返回 5.34Console.WriteLine("num3 的值: {0}", num3);num3=num2??5.34;Console.WriteLine("num3 的值: {0}", num3);Console.ReadLine();}}}

当上面的代码被编译和执行时,它会产生下列结果:


num3 的值: 5.34

num3 的值: 3.14157


可空类型的常用属性和方法

成员 说明 示例
.HasValue 判断变量是否有值 if (num.HasValue)
.Value 获取实际值(若为 null 会抛异常) int x = num.Value;
.GetValueOrDefault() 获取值或默认值(默认 0) num.GetValueOrDefault()
?? 空合并运算符(提供默认值) int result = num ?? 100;

实际应用场景

在处理数据库或外部数据时,可空类型尤其常用。

例如:数据库表中的字段可能为空。

用户ID 年龄 是否激活
1 28 true
2 null false

使用可空类型:


int? age = GetUserAgeFromDB(2);



if (age == null)

    Console.WriteLine("年龄未知");

else

    Console.WriteLine($"用户年龄:{age}");


小结

功能 示例 说明
定义可空类型 int? x = null; 等价于 Nullable<int>
判断是否有值 x.HasValue 判断变量是否已赋值
获取值 x.Value 若为 null 会抛异常
获取默认值 x ?? 0 若为 null 返回默认值
默认值方法 x.GetValueOrDefault(10) 若为 null 返回 10

C# 8.0 的"可空引用类型"

从 C# 8.0 开始,引入了 可空引用类型(Nullable Reference Types) ,它与本文讲的 可空值类型(Nullable Value Types) 不同:

类型 示例 含义
可空值类型 int? 值类型可为 null(运行时支持)
可空引用类型 string? 编译器层面的静态检查(不会改变运行时行为)