博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
认识全面的null
阅读量:7110 次
发布时间:2019-06-28

本文共 2332 字,大约阅读时间需要 7 分钟。

一、基础概念:

一般说来,null表示空类型,也就是表示什么都没有。在.NET中,null表示一个对象引用是无效的。作为引用类型变量的默认值,null是针对指针(引用)而言的,它是引用类型变量的专属概念,表示一个引用类型变量声明但未初始化的状态。在.NET中,对null有如下的基本规则和应用:

  • null为引用类型变量的默认值,为引用类型的概念范畴。
  • null不等同于0、“”、string.Empty,而表示一个空引用。
  • 引用 is 或者 as 模式对类型进行判断或者转换时,需要做进一步的 null 检查。
  • 判断一个变量是否为 null,可以应用==或者!=操作符来完成。
  • 对任何值为 null 的变量操作,都会抛出 NullReferenceException 异常。

 

二、 Nullable<T>(可空类型)

一直以来,null 都是引用类型的特有产物,对值类型进行 null 操作将在编译器抛出异常提示,例如:

1: //抛出编译时错误
2: int i = null;
3: if (i==null)
4: {
5:    Console.WriteLine("i is null.");
6: }

很多情况下,作为开发人员,我们更希望能以一种统一的方式来处理,同时也希望能够解决实际业务需求中对于“值”也可以为“空”这一实际情况的映射。因此,自.NET 2.0以来,这一特权被新的 System.Nullable<T>(即,可空值类型)的诞生打破,解除上述诟病可以很容易以下面的方式被实现:

1:  //Nullable
,解决了这一问题
2:     int? i = null;
3:     if (i==null)
4:     {
5:            Console.WriteLine("i is null.");
6:     }

你可能很奇怪上述的例子中并没有任何Nullable的影子,实际上这是C#的一个语法糖,以下代码在本质上市完全等效的:

int? i = null;Nullable
i = null;

可空类型的伟大意义在于,通过Nullable<T>类型,.Net为值类型添加“可空性”,例如 Nullable<Boolean>的值就包括了 true、false 和 null,而 Nullable<Int32>则表示值既可以为整型也可以为 null。同时,可空类型实现了统一的方式来处理值类型和引用类型的“空”值问题,使得值类型也可以在运行时以 NullReferenceException 异常来处理。 另外,可控类型是内置于CLR的,因此它并非C#的独门绝技。

对于可空类型的小结:

  • 可空类型表示值为 null 的值类型。
  • 不允许使用嵌套的可空类型,例如 Nullable<Nullable<T>>。
  • Nullalbe<T> 和 T? 是等效的。
  • 对可空类型执行GetType方法,将返回类型 T,而不是 Nullable<T>。
  • C#允许在可空类型上执行转换和转型,例如:  
1:  int? a = 100;
2:  Int32 b = (Int32)a;
3:  a = null;
4:   
5:  int? c = (int?)200;

三、??运算符

在实际的程序开发中,为了有效的避免发生异常情况,进行 null 判定是经常发生的事情。例如对于任意对象执行 ToString()操作,都应该进行必要的 null 检查,以避免发生不必要的异常提示,使用传统的三元运算符 (?:):

1:              object obj = new object();
2:              string objName = obj == null ? string.Empty : obj.ToString();
3:              Console.WriteLine(objName);

.NET 2.0 中提供了新的操作运算符来简化 null 值的判定过程,这就是 ?? 运算符。以上过程可以使用以下代码来实现:

1:              object obj = null;
2:              string objName = (obj ?? string.Empty).ToString();
3:              Console.WriteLine(objName);

?? 运算符,又称为 null-coalescing operator,如果左侧操作数为 null,则返回右侧操作数的值,如果不为 null 则返回左侧操作数的值。它既可以应用于可空类型,又可以应用于引用类型。应用 ??运算符实现了简洁的 null 判定,例如通过 ?? 运算符,可以实现一个有意思的代码技巧:

1:              string a = null;
2:              string b = null;
3:              object c = 1;
4:              Console.WriteLine(a ?? null ?? b ?? null ?? c ?? null);
通过多次的 ?? 判定,可以很容易的从一堆候选者 a、b、c中挑选出不是null的那个。

转载于:https://www.cnblogs.com/chaosimple/archive/2012/08/29/2662425.html

你可能感兴趣的文章
单调栈小结
查看>>
将Tp-link无线路由器桥接到Dlink无线路由器上
查看>>
Div和Span标签显示与隐藏
查看>>
highcharts 结合phantomjs纯后台生成图片
查看>>
Eclipse上GIT插件EGIT使用手册之十二_重置功能
查看>>
阻塞自定义队列
查看>>
SVG报错error on line 39 at column 26: Namespace prefix xlink for href on script is not defined
查看>>
error: ‘for’ loop initial declarations are only allowed in C99 mode
查看>>
MySQL和Oracle开发差异
查看>>
NTFS For Mac系统配置有什么要求
查看>>
DevExpress的安装方法与破解教程【转】
查看>>
判断浏览器类型的脚本
查看>>
65个面试常见问题技巧回答(绝对实用)
查看>>
又快又省钱这是什么黑科技?图鸭科技带你领略极致直播体验
查看>>
关于不同的MySQL复制解决方案概述
查看>>
学会这个技能,千元机也能拍出炫酷大片
查看>>
手机市场硝烟弥漫,心系天下三星W2017价格上扬仍一机难求
查看>>
蔚来汽车更新招股书:IPO后李斌将拥有48%投票权
查看>>
快手成央视春晚官方合作伙伴 助力春晚传播
查看>>
春运服务“铁骑”返乡8年女交警:寒风中随车返乡孩子少了
查看>>