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?
|
编译器层面的静态检查(不会改变运行时行为) |