[转] C#中的null

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

原文地址:https://www.cnblogs.com/luqingfei/p/1514058.html