c# - 转换成 "object"类型的目的是什么?

标签 c# .net string equality string-interning

我在一个网站上找到代码如下。

 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# 编译器会在编译时尝试获取所有常量字符串。这称为字符串实习。因此,在代码生成后,ab 是对包含“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”,因为 ab 是内存中两个不同字符串引用,它们看起来都像“xx”。

关于c# - 转换成 "object"类型的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38158572/

相关文章:

c# - 使用 asp.net 成员(member)资格有哪些优点和缺点?

c# - 如何仅使用 CaSTLe Core 2.5.2 中的 DictionaryAdapter?

c# - 在 C# 中按类名作为字符串获取类属性

.Net Compact Framework 和 WinCE 问题

sql-server - 仅当列不为空时才用逗号分隔 SQL Server 连接

c# - 需要帮助理解实现接口(interface)的抽象类

c# - Entity Framework 生成 short 而不是 int

c# - 内部接口(interface)和类

java - 如何在另一个 HashSet<String> 中正确传递/添加 HashSet<String> 中的字符串?

javascript - 两个索引之间的多个顺序字符串替换