这节讲一下C#可空类型(Nullable)
我们知道,值类型在使用前必须设置值,而引用类型则可以是null,但在某些情况下,为值类型设置为空是必要的(如处理数据库数据的时候),微软因此推出了可空类型 System.Nullable<T> 这是一个泛型类,其中,T就代表一个具体的值类型。
在声明和使用中,以下两种情况是不允许的:
以下情况则可以(了解VS的同学会知道,类型颜色变灰说明此处可以简化,这就涉及到它的一个衍生运算符,我们后边讲):
可空类型,可以像引用类型一样,判断是否为空,而且它还有一对属性,HasValue/Value,从字面不难理解,一个是判断其是否有值,一个是取值。
注意,如果没有值,强行访问Value属性,会引发System.InvalidOperationException异常。
可空类型很有用,为此微软新添了一批语法,声明可空类型,可以使用一下语法:
T?和System.Nullable<T>等价,因此用System.Nullable<T>声明对象的时候,编译器会灰化声明代码,因为有简化的T?语法。
?? 运算符
为了进一步简化处理可空类型的代码量,微软引入 ?? 运算符 ,这个运算符叫空结合运算符(null coalescing operator) ,这是一个二元运算符,目的是为了数据为空的情况下,提供默认值
a为空,就返回1,用法很简单,a不为空,返回a的值,这种用法,避免使用if等复杂的代码块,提高了程序可读性。
?.运算符
为了避免可空类型或者引用类型在空引用时引发的NullReferenceException异常,微软又引入了 ?. 空条件运算符,请看代码(举个稍微不恰当的例子):
有一 Person 类,我们可能获取到空的数据对象(此处直接赋值为空),后续直接调用其方法就会引发异常,
下面改用空条件运算符,程序正常运行
我们可以配合 ?? 运算符简化代码
注意,?? 运算符两边的类型必须一致
从错误提示中,我们也可以得知,?? 不能应用于不同类型