什么是 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]
// *s指针[地址值(比如:0x00ff)]->[string]
int i = 1 ; // 值类型。i表示存放着数值一的实际区域。i[0x0001]
空指针的实际含义
string
s;
string s = null ;
// 上面两句是等效的。声明了一个引用类型。
// 假设声明一个s相当于开辟了一个32位的内存区域,系统对该内存区域初始化全部为零。0x0000
string s = null ;
// 上面两句是等效的。声明了一个引用类型。
// 假设声明一个s相当于开辟了一个32位的内存区域,系统对该内存区域初始化全部为零。0x0000
当发现s中全部为0时,则认为该指针为空指针。即不引用(指向)任何对象。
为什么C#1.x值类型不能为null呢?
int
i;
// 声明一个32位的int型。系统对该内存区域初始化全部为零.0x0000
// 声明一个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;