您的位置:首页 > 编程语言 > C#

C#中的null,"", String.Empty的比较

2013-04-03 14:18 225 查看
string s;
string s=null;
string s="";
string s=String.Empty; 的区别

null名词解释:(MSDN)null是一个字面文本,它代表空引用,即引用变量没有引用( 指向)到任何对象,它是引用类型的默认值。
同样会在栈上保存一个地址,这个地址也占4字节,但是这个地址是没有明确指向的,它哪也不指,其内容为0x00000000。

string s;

该语句表示只是声明了一个引用变量,但是并没有初始化引用,所以对变量s的任何操作(除了初始化赋值外)都将引发异常。

string s=null;

该语句表示声明了一个引用变量并初始化引用,但是该引用没有指向任何对象,但可以把它作为参数传递或其它使用,但是不能调用它作为对象的方法 ,如toString,getHashCode等。

string s="";

该语句表示声明
并引用到一个对象,只不过这个对象为0个字节
.所以既然有了对象,就可以调用对象的方法,

string s=String.Empty;

String中Empty的源码定义:

publci static readonly string Empty = "";

如果你不知道static readonly的作用,自己搜下,我简单说下为什么String.Empty可能会比用String s = ""高效:

需要知道的知识:在C#中,所有的字符串都是以HashTable来存放的,key是字符串,value字符串的地址,当用string str = ""的时候,首先会去HastTable中查找""然后,再将""的地址赋给str,这经历了两个过程。而string.Empty,相当于,首先我定义了一个引用,那么这个引用的地址是指向""的实际地址,所以,我用string str = string.Empty的时候,相当于我只是把""的实际地址赋给str,这样省去了在Hashtable中的定位过程,所以在一定程度上提高的效率。

对于网络很多人都认为定义string s=String.Empty没有分配空间,而string s="";分配了空间,实际上都没有分配空间,这其中还涉及一个字符串的内存的驻留机制,我觉得在C#中的内存驻留机制中,已经存在一个""空字符串,所以无论你是string s=String.Empty和string s=""都是不会创建一个新的空间,只是引用,引用""空字符串的内存位置。

这些是我整理所得~~
还是不理解的话,可以参考http://www.bitscn.com/pdb/dotnet/201003/181883.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: