C#中的可空类型

  一、可空类型(Nullable Type)表示在值类型的正常取值范围内再加上一个null值,声明一个可空类型的标准语句如下:

T? myNullableNum = rangedNum/new T?() or null; //其中T需要为值类型

  例如,声明一个可空整数类型并赋值为null:

int? myNullableInt = null; //或使用为new int?()

  1.可空类型是泛型结构Nullable<T>的实例,其声明为:public struct Nullable<T> where T : struct,语法T?是Nullable<T>的简写形式,这两种形式是等效的:

Nullable<int> myNullableInt = new Nullable<int>();

  ※根据声明可以看出,其基础类型T可以是包括struct和enum在内的任何值类型,不能是引用类型,也不能是可空类型,即可空类型不能嵌套使用;可空类型依然是值类型,且为结构类型;

  ※直接将普通类型或null赋值给可空类型是隐式转换的结果;

  二、可空类型包含以下实例成员:

  1.HasValue:只读属性,判断是否有值,如果当前值非空,返回true,否则返回false

  2.Value:只读属性,如果当前值非空,可以正常访问,否则说明Value不包含有意义的值,此时访问Value时会抛出异常InvalidOperationException

  3.GetValueOrDefault():实例方法,如果当前值非空(HasValue为true),返回Vlaue的值,否则返回T类型的默认值(即私有字段value的默认值)

  4.GetValueOrDefault (T defaultValue):实例方法,如果当前值非空(HasValue为false),返回Vlaue的值,否则返回默认值defaultValue

  三、如果将可空类型转换为其基础类型,需要使用强制转换或其Value属性获取:

int myInt = (int)myNullableInt;
int myInt = myNullableInt.Value;
//以上两种方式,在可空类型实例为null时会抛出异常,可以使用以下方式代替
int myInt = myNullableInt.GetValueOrDefault(); //其重载方法可以传入默认值

  四、可空类型可以使用其基础类型中自定义的运算符重载和类型转换,如果操作数不包含null,则运算结果与其基础类型的运算结果一致,如果操作数包含null,则运算结果为null,在运算过程中,实际上是调用的可空类型的实例方法GetValueOrDefault()参与运算:

int? myNullableInt = 100;
int? myNum = myNullableInt + 200;

  五、对可空类型使用比较运算符时,如果其中一个可空类型的值为null,而另一个为非null,则除!=(不等于)外,所有比较的计算结果均为false,所以并不是某个比较返回false,其相反的情况一定会返回true;

 


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的认可是我写作的最大动力!

作者:Minotauros
出处:https://www.cnblogs.com/minotauros/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted @ 2019-06-30 22:22 Minotauros 阅读(...) 评论(...) 编辑 收藏