我在一个网站上找到代码如下。
string a = "xx";
string b = "xx";
string c = "x";
string d = String.Intern(c + c);
Console.WriteLine((object)a == (object)b); // True
Console.WriteLine((object)a == (object)d); // True
这里a,b,d本身就是string的对象,又转成object类型的目的是什么?
最佳答案
C# 编译器会在编译时尝试获取所有常量字符串。这称为字符串实习。因此,在代码生成后,a
和 b
是对包含“xx”的相同字符串的引用。
您可以通过比较它们的引用来检查这一点(将它们转换为对象并进行相等性检查或使用 object.ReferenceEquals
)。请记住,字符串的 ==
运算符比较它们的值而不是它们的引用。
另一件事是 strings are immutable在 .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);
进行引用检查?因为编译器会在对象上选择 ==
运算符来检查引用是否相等。
因此,在您的问题中转换为 object 的全部意义在于检查字符串实习是否有效。 假设编译时没有实习发生。
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”。
关于c# - 转换成 "object"类型的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38158572/