Code:
using System;
using System.Text;
namespace CsDev
{
class Class3
{
static void Main()
{
string a = "avd";
string b = "av";
string c = "d";
b = b + c;
string d = "avd";
Console.WriteLine(object.ReferenceEquals("avd",a));//True
Console.WriteLine(object.ReferenceEquals("avd", b));//False
Console.WriteLine(object.ReferenceEquals(a, d));//True
Console.ReadKey();
}
}
}
输出:
True
False
True
原因:
CLR内部对string类型有一个Hash表,键值对为string的内容与Object,每当new一个新string时,CLR会先检查是否已经有相同内容string的对象存在,如有则直接使用。
b对象先new的时候,内容为"av",在hash表中没有对象的对象存在,所以就new了一个Object赋给b,然后b+c只是改变b引用的对象的内容,不改变其本身引用的值(可以当指针理解)。
所以最后进行引用比较的时候,这里是直接比较引用(比较指针),故为False。