String.Empty,NULL和""的区别
String.Empty,NULL和""的区别
一、""和String.Empty
1、共同点
Empty是string类中的一个静态的只读字段,他的定义
public static readonly String Empty = "";
string.Empty就相当于"",这两个都是表示空字符串,一般用于字符串的初始化,或者用于比较:
if(a=="")
if(a==string.Empty)
上面两句是一样的效果。
CLR会对字符串进行优化,所以””和string.Empty也都会被优化。
例如:
(1)、声明如下两个变量
string str1=””;
string str2=””;
str1与str2的引用会是相同的也就是str1与str2在栈上保存的地址上相同的
(2)、同理对于
string str3=string.Empty;
string str4= string.Empty;
str3与str4的地址也是相同的。也是在内存堆上共享同一空间。
2、区别
””是通过CLR进行优化的,CLR会维护一个字符串池,以防在堆中创建重复的字符串。
string.Empty是一种c#语法级别的优化,是在C#编译器将代码编译为IL(即MSIL)时进行了优化,即所有对string类的静态字段Empty的访问都会被指向同一引用,以节省内存空间。
二、string.Empty与null的区别
string.Empty会在堆上占用一个长度为0的空间,而null不会。具体内容如下:
string str1=””;
string str2=null;
如刚才所说str1会在栈上保存一个地址,这个地址占4字节,指向内存堆中的某个长度为0的空间,这个空间保存的是str1的实际值。
str2同样会在栈上保存一个地址,这个地址也占4字节,但是这个地址是没有明确指向的,它哪也不指,其内容为0x00000000。