【发布时间】:2016-11-04 15:25:25
【问题描述】:
我在一个网站上找到了如下代码。
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 本身就是字符串的对象,再次转换成对象类型的目的是什么?
【问题讨论】:
-
绝对没有。 System.String 继承自 System.Object
-
无需投...
-
该代码的作者想要调用
operator==(object, object)(引用相等)而不是(就重载决议而言更合适)operator==(string, string)(值相等),因此进行了强制转换。运算符调用不是多态的,它们在编译时被解析。另一种方法是调用object.ReferenceEquals()而不进行强制转换。 -
类型系统的颠覆。
-
该网站缺少解释正在发生的事情的代码;也就是说,如果我们有
string e = c + c;,那么e和a将不会使用“对象”版本比较相等,而是仅使用== 而不进行强制转换来比较相等。这是理解字符串实习的关键点:它改变了 reference 比较,同时保持 value 比较相同。
标签: c# .net string equality string-interning