为什么在这种情况下,object的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,因为它比较了我的对象的引用。
发布于 2012-02-02 20:54:19
第一个示例有一个由两个变量引用的编译时间常数"fg"。因为这是一个编译时间常量,所以两个变量引用一个对象。引用是相等的。
有关此行为的更多信息,请阅读string interning主题。作为初学者,请考虑:
例如,如果将相同的文字字符串分配给多个变量,则运行时将从intern池中检索对文字字符串的相同引用,并将其分配给每个变量。
http://msdn.microsoft.com/en-us/library/system.string.intern.aspx
在第二个示例中,只有一个是编译时间常量,另一个是某些操作的结果。a和d不引用相同的对象,因此从ReferenceEquals得到的结果为假。
发布于 2012-02-02 20:54:56
它在这两种情况下都运行正常。
a和b是相同的string对象的原因是,编译器已经注意到您指定了相同的string两次,并且重用了相同的string对象来初始化a和b。
这通常会发生在应用程序中的每个字符串常量中。
发布于 2012-02-02 20:57:14
由于您引用了相同的文字("fg"),因此两个字符串实际上将指向相同的内容。请看这篇文章:http://csharpindepth.com/Articles/General/Strings.aspx (“实习”一段)。
问候你,Piotr
https://stackoverflow.com/questions/9112610
复制相似问题