.NET中有关string几个特点
int a = 5;
int b = 5;
Console.WriteLine(Object.ReferenceEquals(a,b)); //———-1
string aa = "Hello";
string bb = "Hello";
Console.WriteLine(Object.ReferenceEquals(aa,bb)); //———-2
string c = "Hel";
string d = c + "lo";
Console.WriteLine(Object.ReferenceEquals(aa,d)); //———-3
string e = "Hel" + "lo";
Console.WriteLine(Object.ReferenceEquals(aa,e)); //———-4
看看上面的输出分别是什么.
正确结果是Flase,True,False,True
如果你答对了,就不用往下看,如果没有答对,你也可以不用往下看![]()
1. 第一个因为存在隐式装箱,会从值类型装箱成引用类型,会创建新的对象,所以结果是False.
2. String是引用类型,string a="a";和string a=new string("a");是等价的,会创建对象,这样说aa和bb应该是不同的对象啊,为什么会是同一个对象呢?原因是这样的,在.NET中因为string类型是不可变的引用类型,也是使用频率最多的类型之一,如果采取普通的创建对象的方式,会带来很多小的string对象,占据内存空间,影响效率.所以,.NET就采取了一种技巧,称为"字符串池",会把代码中的字符串常量Hash起来,所有同样的字符串都是使用同一个对象,因为string是不可变对象,所以这样做是不会有任何问题.所以结果是True,是同一个对象.
3.我们说.NET会Hash字符串常量,但是如果一个字符串是用变量组成,JIT是会创建一个新的对象,所以是False.
4.如果一个字符串是由字符串常量组成,在编译的时候,编译器会自动将其合成一个字符串,可以用ildasm查看il代码便知.这个时候相当于是一个字符串常量,所以结果是True.