本帖最后由 王赟 于 2013-4-19 16:54 编辑
区别主要体现在编译器的检查上。在默认情况下,创建一个引用变量,CLR即将其初始化为null,表示不指向任何实例,所以本质上二者有相同的意义。
- //编译器检测错误,使用了未赋值的obj
- //object obj;
- //编译器理解为执行了初始化操作,所以不引发编译时错误
- object obj = null;
- if (obj == null)
- {
- //运行时抛出NullReferenceException异常
- Console.WriteLine(obj.ToString());
- }
复制代码 事实上,将- static void Main(string[] args)
- {
- object o;
- object obj = null;
- }
复制代码 反编译为IL时,二者在IL还是存在一定差别的:- .medthod private hidebysig void Main(string[] args) cil managed
- {
- .entrypoint
- .maxstack 1
- .locals init(
- [0] objcet o,
- [1] objcet obj)
- L_0000:nop
- L_0001:ldnull
- L_0002:stloc.l
- L_0003:ret
- }
复制代码 前者没有附加任何操作,后者通过一个ldnull指令推进一个空间给evaluation stack,而stloc则将空引用保留。
在.NET中,对null有如下规则和应用
1.null为引用类型变量的默认值,为引用类型的概念范畴。
2.null不等同归0 "" string.Empty,而表示一个空引用、
3.引用is或者as模式对类型进行判断和转换时,需要进一步对null进行检查。
4.判断一个变量师傅是null,可以用==或许!=等操作符来完成。
5.对任何值为null的变量操作,都会抛出NullReferenceException异常。
|