理解null值和可空类型

来源:互联网 发布:全知视角和有限视角 编辑:程序博客网 时间:2024/06/01 15:35

C#允许将null值赋给任意引用变量,值为null的变量表明该变量不引用内存中的任何对象,

Circle c = new Circle(42);Circle copy =null; // 声明的同时进行初始化...if(copy == null){    copy = c; // copy 和 c引用同一个对象    ...}

C#6.0新增了空条件操作符来更简洁的测试空值,使用它需要为变量名附加问号(?)前缀 例如 ,以下代码在Circle 对象包含空值的时候调用其Area方法:

Circle c = null;Console.WriteLine($"The area of circle c is {c.Area()}");

这造成Circle.Area方法抛出一个NullReferenceException, 这很合理,因为无法计算不存在的一个圆的面积,为了避免该异常,可以先检测Circle对象是否为null,再决定是否调用其Area方法:

if(c != null){    Console.WriteLine($"The area of circle c is {c.Area()}");}

如果c为空,就不会向命令提示窗口写入任何内容 还可在尝试调用CircleArea之前在Circle对象上使用空条件操作符:

Console.WriteLine($"The area of circle c is {c?.Area()}");

空条件操作符告诉”运行时”在操作符所应用的变量为null的前提下忽略当前语句,在本例中,命令提示窗口会显示以下文本:

The area of circle c is

使用可空类型
null值在初始化引用类型非常有用,但null本身就是引用,不能把它赋给值类型,

int i = null; // 非法int? i = null; // 合法

但是利用C#定义的修饰符(?),可以将变量声明为可空值类型

可空类型公开了两个属性,用于判断类型是否实际包含非空的值,以及该值是什么, 其中 ,
HasValue属性判断可控类型是否包含一个值,还是包含null,如果包含值,可用Value属性获取该值

int? i = null;...if(!i.HaValue){    // !取反 如果i不包含值 为null,就将99赋值给它    i = 99;}else{    //如果i不为null,就显示它的值    Console.WriteLine(i.Value);}
原创粉丝点击