【C#零基础从入门到精通】(十五)——C# Nullable可空类型
详解
在 C# 中,可空类型是一项重要的特性,它允许值类型的变量可以表示其正常范围内的值,还可以表示为空(null
)。在传统的值类型(如int
、bool
、DateTime
等)中,它们不能直接赋值为null
,而可空类型弥补了这一不足,下面从可空类型的定义、使用、操作符、转换以及与数据库交互等方面详细介绍。
可空类型的定义
可空类型是基于System.Nullable<T>
结构体实现的,不过在 C# 里有更简洁的语法糖,即通过在值类型后面加上问号?
来定义可空类型。其通用语法为:
T? variableName;
这里的T
代表任意值类型,variableName
是变量名。例如:
int? nullableInt = null;
bool? nullableBool = false;
DateTime? nullableDateTime = DateTime.Now;
在上述代码中,nullableInt
、nullableBool
和 nullableDateTime
分别是可空的int
、bool
和 DateTime
类型变量。
可空类型的使用
赋值操作
可空类型变量既可以赋值为对应值类型的值,也可以赋值为null
。示例如下:
int? num = 10;
num = null;
访问可空类型的值
要访问可空类型变量的值,可以使用Value
属性,但在访问前需要先检查HasValue
属性,以避免InvalidOperationException
异常。示例如下:
int? nullableNum = 20;
if (nullableNum.HasValue)
{
int value = nullableNum.Value;
Console.WriteLine($"可空类型的值是: {value}");
}
else
{
Console.WriteLine("可空类型的值为 null");
}
可空类型的操作符
空合并操作符(??
)
空合并操作符用于在可空类型变量为null
时,提供一个默认值。其语法为:
nullableValue ?? defaultValue
示例如下:
int? nullableNumber = null;
int result = nullableNumber ?? 5;
Console.WriteLine(result); // 输出 5
在这个例子中,由于nullableNumber
为null
,所以result
被赋值为默认值5
。
可空类型的转换
显式转换
当需要将可空类型转换为非可空类型时,如果可空类型的值为null
,则会抛出InvalidOperationException
异常。因此,在转换前需要进行检查。示例如下:
int? nullableIntValue = 15;
if (nullableIntValue.HasValue)
{
int intValue = (int)nullableIntValue;
Console.WriteLine(intValue);
}
隐式转换
非可空类型可以隐式转换为对应的可空类型。示例如下:
int normalInt = 25;
int? nullableFromNormal = normalInt;
可空类型在数据库交互中的应用
在与数据库交互时,数据库中的字段可能允许为NULL
。在 C# 中使用可空类型可以很好地映射这种情况。例如,使用 Entity Framework 进行数据访问时,数据库中允许为NULL
的int
类型字段可以映射为 C# 的int?
类型。以下是一个简单的实体类示例:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public int? StockQuantity { get; set; } // 库存数量,可能为 null
}
可空引用类型(C# 8.0 及以上)
从 C# 8.0 开始,引入了可空引用类型的概念,允许引用类型(如string
、自定义类等)显式地标记为可空。在项目文件中启用可空引用类型后,可以这样定义可空引用类型变量:
#nullable enable
string? nullableString = null;
同时,编译器会对可空引用类型进行静态分析,帮助开发者避免空引用异常。
实例应用
using System;
namespace c.biancheng.net
{
class Demo
{
static void Main(string[] args){
int? num1 = null;
int? num2 = 123;
int num3;
num3 = num1 ?? 321;
Console.WriteLine("num3 = {0}", num3);
num3 = num2 ?? 321;
Console.WriteLine("num3 = {0}", num3);
Console.ReadLine();
}
}
}
运行结果如下:
num3 = 321
num3 = 123