【发布时间】:2014-03-03 03:26:37
【问题描述】:
我阅读了 Jon Skeet 的测验,我想知道为什么我的第二个样本不起作用而第一个样本起作用。
为什么会产生true:
object x = new string("".ToArray());
object y = new string("".ToArray());
Console.WriteLine(x == y); //true
但是这个没有:
var k="k";
//string.intern(k); // doesn't help
object x = new string(k.ToArray());
object y = new string(k.ToArray());
Console.WriteLine(x == y); //false
我正在使用 fw 4.5 和 vs2010。
幸运的是,我也安装了 vs2005,结果相同:
【问题讨论】:
-
如果你像这样比较
x.Equals(y)那么它将返回true -
那么如果按值比较的话,“k”字符串不应该等于另一个“k”字符串吗?
-
我不确定您为什么接受下面的答案,它甚至没有解决问题的内容。在您的第一个示例中,您使用字符串构造函数来实例化空字符串。那应该给出全新的参考,而不是相同的。
-
我做到了,但文字
""和String.Empty与new String(new char[0])是不同的野兽。据我所知,没有一个答案真正解决了这个问题。来自 Eric Lippert 博客的引用被断章取义。它谈论的是空字符串文字和String.Empty。两个独立更新的字符串恰好为空的情况仍不清楚。所有答案都围绕着这个解释轻松地跳了起来。 -
是的,我可能对那一点太多了。无论出于何种原因,在博客的上下文中阅读它对我来说都是不同的。
new T() != new T()对所有T并不总是正确的想法现在让我大吃一惊。