为什么在这种情况下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
,因为它会比较我的对象的引用。
答案 0 :(得分:15)
第一个示例的编译时常量"fg"
由两个变量引用。由于这是一个编译时常量,因此这两个变量引用了一个对象。引用是相同的。
阅读 string interning 主题,了解有关此行为的更多信息。作为首发,请考虑:
例如,如果将相同的文字字符串分配给多个变量,则运行时将从实习池中检索对文字字符串的相同引用,并将其分配给每个变量。
http://msdn.microsoft.com/en-us/library/system.string.intern.aspx
在第二个例子中,只有一个是编译时常量,另一个是某些操作的结果。 a
和d
不引用同一个对象,因此您会从ReferenceEquals
获得错误结果。
答案 1 :(得分:2)
在两种情况下都表现正常。
a
和b
是同一个字符串对象的原因是因为编译器已经注意到您指定了相同的字符串两次,并且重用了相同的字符串对象来初始化a
和b
。
这通常会在应用程序中的每个字符串常量中发生。
答案 2 :(得分:0)
由于你引用了相同的文字(“fg”),你的两个字符串实际上都指向同一个东西。请看一下这篇文章:http://csharpindepth.com/Articles/General/Strings.aspx(“实习”一段)。
此致 彼得
答案 3 :(得分:0)
根据这个post,它与被称为实习的东西有关。在你的情况下,a和b是两个指向同一实例的变量,这就是ReferenceEquals返回true的原因。