关于可空值类型

有这样一个场景,在数据库中经常有一些字段是可以为空的,把数据库中的字段映射成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

转载于:https://www.cnblogs.com/dongqinglove/p/3556611.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值