小议C#中的可空值类型

来源:互联网 发布:内网监控软件 编辑:程序博客网 时间:2024/05/19 19:33

     通常一个值类型变量永远不可能为null,它总是包含值类型的值本身。但是在某些情况下会遇到一些问题如:在映射数据库中的一个可空值列时,使用Framework来处理数据库数据时变得相当困难;为了解决这一问题CLR中引入了“可空值类型(nullable value type)”

     为理解它们是如何工作的,先看看CLR中的逻辑:

 

    调用和输出:

     C#中允许使用问号来申明初始化变量(等同于上面代码)如:

        Int32? x = 5;

        Int32? y = null;

     总结一下C#对可空值类型对操作符的解释:
      a.一元操作符如果操作数为null,结果为null;
      b.二元操作符中任何一个为null,结果为null;
      c.比较操作符如果两人个操作数都为null,两者相等;如果一个为null,两者不相等;如果两个数都不为null,对值进行比较;
     注意:在操作值类型时会生成大量代码,代码类似对基类(Nullable)代码的调用;

     当CLR对一个Nullable<T>实例进行装箱时,会检查它是否为null,如果为null,CLR不实际进行装箱操作,并会返回null值;

如果实例不为空,将从类型中取出值,并对其进行装箱如:

     在应用可空值类型进行拆箱时,CLR会分配内存(这是一个极特殊的行为,在其它所有情况下,拆箱永远不会导致内存的分配),原因在于一个已装箱的值类型不能简单的拆箱为值类型的可空版本,在已装箱的值类型中并不包含Boolean hasValue字段,故在拆箱时CLR必须分配一个Nullable<T>对象,已初始化hasValue = true ,value = 值类型值。这会对应用程序性能造成一定影响。

     通过可空值类型调用接口方法