【发布时间】:2014-10-02 17:54:35
【问题描述】:
这是我的示例代码。
string a = "test";
object c = a;
Console.WriteLine(a == c);
Console.WriteLine(object.Equals(a, c));
Console.WriteLine(a.Equals(c));
Console.WriteLine(c.Equals(a));
本例输出如下
True
True
True
True
这是另一个代码示例
string a = "test";
string b = "te";
object c = b + "st";
Console.WriteLine(a == c);
Console.WriteLine(object.Equals(a, c));
Console.WriteLine(a.Equals(c));
Console.WriteLine(c.Equals(a));
现在这个例子更有趣了,因为输出是这样的
False
True
True
True
这真的让我感动,让我问自己一个问题,== 如何比较两个对象?我寻找答案,但找不到任何可以解释的东西?谁能解释一下。这是在使用 .NET 4.5.1 的机器上执行的
【问题讨论】:
-
提示:
==被string重载。因此,如果两个操作数都是string(操作数的编译时类型,而不是执行时类型),它将调用重载,检查字符串是否相等而不是引用相等。 -
扩展@JonSkeet 所说的内容:如果您将
c声明为string,或者将其转换为字符串(a == (string)c),那么比较将返回true。这是string(以及极少数其他类型)特有的行为,这是string是不可变类(而不是值类型)的结果。 -
好的,但是你怎么解释,在这两种情况下,对象 c 都指的是同一个“测试”文字字符串,在这两种情况下都是实习的,如果我的知识是正确的字符串 a 和对象 c 在这两种情况下案例应该引用文字字符串“test”
-
查看我的答案,了解关于字符串实习和参考比较的推理。