C# 编译器将尝试在编译时获取所有常量字符串。这称为字符串实习。因此,在生成代码之后,a
并且b
是对包含“xx”的相同字符串的引用。
您可以通过比较它们的引用来检查这一点(将它们转换为 object 并进行相等性检查或 use object.ReferenceEquals
)。请记住,==
字符串的运算符比较它们的值而不是它们的引用。
另一件要提的事情是字符串在 .NET 中是不可变的。
string a = "xx";
string b = "x" + "x"; // String interning here
string c = string.Join("", new[] { "x", "x" }); // No interning here because it is evaluated at runtime
Console.WriteLine((object)a == (object)b); // True. Reference check
Console.WriteLine(a == b); // True. Value check
Console.WriteLine((object)a == c); //False. Reference check. Described below
Console.WriteLine(a == c); // True. Value check
那么为什么Console.WriteLine((object)a == c);
要做参考检查呢?因为编译器将选择==
检查引用相等性的对象上的运算符。
因此,在您的问题中转换为对象的全部目的是检查字符串实习是否有效。假设在编译时没有实习。
string a = "xx";
string b = "xx";
string c = "x";
string d = String.Intern(c + c);
然后Console.WriteLine((object)a == (object)b);
会打印“False”,因为a
和b
是内存中两个不同字符串的引用,它们看起来都像“xx”。