ReferenceEquals工作错误的字符串

为什么在这种情况下,对象的ReferenceEquals方法表现不同?

 string a= "fg"; string b= "fg"; Console.WriteLine(object.ReferenceEquals(a, b)); 

所以在这种情况下,它得到的结果是true 。 如果它比较我的字符串的值而不是引用。 但是当我写下这样的话:

 StringBuilder c = new StringBuilder("fg"); string d = c.ToString(); Console.WriteLine(object.ReferenceEquals(a, d)); 

在这种情况下,它工作正常,结果是false ,因为它比较了我的对象的引用。

第一个示例具有编译时常量"fg" ,由两个变量引用。 由于这是一个编译时常量,因此这两个变量引用了一个对象。 参考是平等的。

有关此行为的更多信息,请阅读字符串实习的主题。 作为首发,请考虑:

例如,如果将相同的文字字符串分配给多个变量,则运行时将从实习池中检索对文字字符串的相同引用,并将其分配给每个变量。

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

在第二个示例中,只有一个是编译时常量,另一个是某些操作的结果。 ad不引用同一个对象,因此您从ReferenceEquals获取错误结果。

它在两种情况下都表现正常。

ab是同一个字符串对象的原因是因为编译器已经注意到你指定了两次相同的字符串,并且重用了相同的字符串对象来初始化ab

这通常会发生在应用程序中的每个字符串常量。

由于你引用了相同的文字(“fg”),你的字符串实际上都指向同一个字符。 请看一下这篇文章: http : //csharpindepth.com/Articles/General/Strings.aspx (“Interning”段落)。

问候,Piotr

根据这篇文章,它与称为实习的事情有关。 a和b在你的情况下是指向同一个实例的两个变量,这就是ReferenceEquals返回true的原因。