http://blog.csdn.net/snlei/archive/2008/02/02/2077874.aspx
什么是 null?
null是所谓的文字关键字
什么是文字关键字
计算机是二进制表示一切,文字关键字就是以文字的形式表示某个特定的二进制值。比如ture,false也是文字关键字。可以认为true表示0x0001;false表示0x0000的bool值。
C#1.X中的null=空指针
MSDN中的解释:null 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认值。
重点:区分引用类型和值类型。
string s="string";//引用类型。s是一个指针,该指针指向一个存放了"string"字符串的地址。
//*s指针[地址值(比如:0x00ff)]->[string]
int i=1;//值类型。i表示存放着数值一的实际区域。i[0x0001]
空指针的实际含义
string s;
string s=null;
//上面两句是等效的。声明了一个引用类型。
//假设声明一个s相当于开辟了一个32位的内存区域,系统对该内存区域初始化全部为零。0x0000
当发现s中全部为0时,则认为该指针为空指针。即不引用(指向)任何对象。
为什么C#1.x值类型不能为null呢?
int i;
//声明一个32位的int型。系统对该内存区域初始化全部为零.0x0000
问题来了,当发现i中全部为零时,系统无法判断该值是没有赋值,还是为0值。
C#2.0中的可空类型Nullable<T>
在数据库中,任何数据可以为空。但是在C#1.x却不能,因此引入了Nullable<T>可空类型,T 必须是值类型
既然可空类型可以=null,那么可空类型是值类型还是引用类型呢?
答:可空类型依然是值类型。但是对一个可空类型赋值为null和引用类型赋值为null的内部操作是不一样的。
可空类型的内部结构中,有一个bool类型的变量。hasValue.当hasValue=false时,表示该对象为空。因此对于int?? i=null;所做的操作,其实是i.hasValue=false。而对string s=null所做的操作其实是*s=0;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/snlei/archive/2008/02/02/2077874.aspx