• 关于可空值类型


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

  • 相关阅读:
    htnl类名命规范
    JAVA集合中泛型的原理本质简介
    java 泛型中的上界(extend)和下界(super)
    elasticsearch深度分页问题
    AOP组合使用切面和自定义注解
    G1垃圾回收器基本知识及原理解析
    MyBatisplus源码解析
    生产环境碰到系统CPU飙高和频繁GC,你要怎么排查?
    fullgc触发条件_记一次生产频繁出现 Full GC 的 GC日志图文详解
    JavaThreadContextLoader(线程上线文类加载器)总结
  • 原文地址:https://www.cnblogs.com/dongqinglove/p/3556611.html
Copyright © 2020-2023  润新知