现在位置: 首页 > C# 教程 > 正文

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?();

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

实例

using System;
namespace CalculatorApplication
{
   class NullablesAtShow
   {
      static void Main(string[] args)
      {
         int? num1 = null;
         int? num2 = 45;
         double? num3 = new double?();
         double? num4 = 3.14157;
         
         bool? boolval = new bool?();

         // 显示值
         
         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>

实例

using System;
namespace CalculatorApplication
{
   class NullablesAtShow
   {
         
      static void Main(string[] args)
      {
         
         double? num1 = null;
         double? num2 = 3.14157;
         double num3;
         num3 = num1 ?? 5.34;      // num1 如果为空值则返回 5.34
         Console.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? 编译器层面的静态检查(不会改变运行时行为)