C#中的可空类型(Nullable Types)是一种特殊的类型,它允许值类型(如int、double、bool等)的变量除了可以存储其正常的值域内的值之外,还可以存储一个额外的值——null。这表示变量没有值或值是未知的。可空类型在处理数据库字段、JSON数据或其他可能不包含值的数据源时非常有用。
可空类型的声明
在C#中,可以通过在值类型后面加上一个问号(?)来声明一个可空类型。例如:
int? nullableInt = null; // 声明一个可空的整数类型变量,并赋值为null
double? nullableDouble; // 声明一个可空的双精度浮点类型变量
bool? nullableBool = true; // 声明一个可空的布尔类型变量,并赋值为true
可空类型的属性
可空类型实际上是一个泛型结构Nullable<T>
的实例,其中T
是值类型。Nullable<T>
结构有两个重要的属性:
- HasValue:这是一个只读属性,用于判断可空类型变量是否有值。如果变量有值(即不是null),则返回true;否则返回false。
-
Value:这也是一个只读属性,用于获取可空类型变量的值。但是,如果变量没有值(即是null),则访问此属性会抛出
InvalidOperationException
异常。
可空类型的方法
除了属性之外,Nullable<T>
结构还提供了一些方法用于处理可空类型:
-
GetValueOrDefault():如果可空类型变量有值,则返回该值;否则返回类型
T
的默认值(例如,对于int?
类型,默认值是0)。 - GetValueOrDefault(T defaultValue):这个方法允许你指定一个默认值。如果可空类型变量有值,则返回该值;否则返回指定的默认值。
空合并运算符(??)
C#还提供了一个空合并运算符(??),它用于在可空类型变量为null时提供一个默认值。例如:
int? nullableInt = null;
int result = nullableInt ?? 5; // 如果nullableInt为null,则result的值为5;否则,result的值为nullableInt的值
注意事项
- 可空类型不能嵌套使用,即不能声明一个可空的可空类型(如
int??
是不合法的)。 - 当将可空类型变量转换为非可空类型时,需要使用显式转换或检查
HasValue
属性以避免运行时异常。 - 在比较可空类型变量时,如果其中一个变量为null,则除了“不等于”(!=)运算符之外,所有比较运算符的结果都为false。