这节讲一下C#可空类型(Nullable)
我们知道,值类型在使用前必须设置值,而引用类型则可以是null,但在某些情况下,为值类型设置为空是必要的(如处理数据库数据的时候),微软因此推出了可空类型 System.Nullable<T> 这是一个泛型类,其中,T就代表一个具体的值类型。
在声明和使用中,以下两种情况是不允许的:
![aafd4d9e29b70f4cf0783e4a72eefff9.png](https://i-blog.csdnimg.cn/blog_migrate/85bca5c4949ed65f38e8483b7e8b0121.png)
![c2f81870d40f2be397cbceaae74440cf.png](https://i-blog.csdnimg.cn/blog_migrate/1e0ac6ad1fd5169566abbf51a02882ae.png)
以下情况则可以(了解VS的同学会知道,类型颜色变灰说明此处可以简化,这就涉及到它的一个衍生运算符,我们后边讲):
![b06ab2376f84cb7bc04f51ea57027883.png](https://i-blog.csdnimg.cn/blog_migrate/09c8a6d8d7dfb0887451492088b4b6e9.png)
可空类型,可以像引用类型一样,判断是否为空,而且它还有一对属性,HasValue/Value,从字面不难理解,一个是判断其是否有值,一个是取值。
![fccdbc818d0d01ea88dd956d30a761bc.png](https://i-blog.csdnimg.cn/blog_migrate/f12b96ecb5e801dd32d452475d27443c.png)
注意,如果没有值,强行访问Value属性,会引发System.InvalidOperationException异常。
可空类型很有用,为此微软新添了一批语法,声明可空类型,可以使用一下语法:
![20b05f911664e407612602781614dc19.png](https://i-blog.csdnimg.cn/blog_migrate/3e854e4aee36c56384ed0f0dd8aed877.png)
T?和System.Nullable<T>等价,因此用System.Nullable<T>声明对象的时候,编译器会灰化声明代码,因为有简化的T?语法。
?? 运算符
为了进一步简化处理可空类型的代码量,微软引入 ?? 运算符 ,这个运算符叫空结合运算符(null coalescing operator) ,这是一个二元运算符,目的是为了数据为空的情况下,提供默认值
![c722e3134a95b63168f502ebb39ae1e4.png](https://i-blog.csdnimg.cn/blog_migrate/8deb41ed4293c06b9261747008ccd50f.png)
a为空,就返回1,用法很简单,a不为空,返回a的值,这种用法,避免使用if等复杂的代码块,提高了程序可读性。
?.运算符
为了避免可空类型或者引用类型在空引用时引发的NullReferenceException异常,微软又引入了 ?. 空条件运算符,请看代码(举个稍微不恰当的例子):
有一 Person 类,我们可能获取到空的数据对象(此处直接赋值为空),后续直接调用其方法就会引发异常,
![f9af20ce4f791ca025b66d6345fb804c.png](https://i-blog.csdnimg.cn/blog_migrate/7cf3f3e793e6f9691e5dd55c2e4469e6.png)
下面改用空条件运算符,程序正常运行
![7a3b2c85ad64af8ca020acc336de6d44.png](https://i-blog.csdnimg.cn/blog_migrate/249f2eec31ee0f93be75ebf75d8575f4.png)
我们可以配合 ?? 运算符简化代码
![42f4f365cc550411ad4b2993c9b87ba3.png](https://i-blog.csdnimg.cn/blog_migrate/cd6845b512b9d377223b3703e885a84c.png)
注意,?? 运算符两边的类型必须一致
![14611ee0aee0cb9336ee5418b7778892.png](https://i-blog.csdnimg.cn/blog_migrate/33cba77af3b5a41188967859600706d3.png)
从错误提示中,我们也可以得知,?? 不能应用于不同类型
个人公众号:Start Off CSharp
个人博客:https://www.cnblogs.com/charlesmvp/
好文章,有人看才有价值