有这样一个场景,在数据库中经常有一些字段是可以为空的,把数据库中的字段映射成c#中的一个对象会出现一些问题,比如:一个人的出生日期是一个值类型DateTime,在数据库中是可以为空的一个字段,当你使用ado.net把它映射成对象的时候,对DateTime属性赋值就变的比较困难了,如果数据库中这个值是NULL,映射的对象要想准确的反映数据库中的字段,那就必须给对象的DateTime赋值为null,但是值类型不能赋值为null,所以才有了可空值类型来解决这一问题。
引用类型是可以赋值为null的。但值类型是不能赋值为null的。如果在值类型之后加一个?,那么“普通的值类型”,就变成了一个“可空值类型”,可空值类型不仅可以赋值一个普通的值,也可以赋值一个null。不能在引用类型后加 ? ,只能在值类型之后加 ?
Code:
int? n;
n = null;
if (n == null)
{
Console.WriteLine("现在整形可以被赋值为空");
}
Console.ReadKey();
打印结果为:现在整形可以被赋值为空
我们很奇怪为什么int ?类型就可以赋值为空呢,它到底是一个什么类型,我们通过反编译工具可以看出原来它是Nullable类型,但是Nullable类型也是一个值类型,为什么可以赋值给null呢?
我们看到了反编译工具里的这句话:
没错,原来微软把=给重写了,所以我们可以给它赋值,上面的n=null其实就是执行的 return value.Value的值,而 int ? n=9就是调用的implicit operator T?这个方法 ,再调用Nullable的构造函数
这样value字段里就有值了,我们可以通过Value属性来访问这个值,如果可空值类型被赋值为null,就不能调用上面的构造方法,通过Value取值时就会报错,HasValue就是用来标记我们赋的值是空值还是一个结构类型的值,如果是结构类型的值,就会调用构造方法,
HasValue就会被赋值为true,