如何比较具有字符串值的两个对象?

7
我使用这段代码,得到了正确的结果:
 object text1 = "test";
 object text2 = "test";
 Console.WriteLine("text1 == text2 : " + (text1 == text2));
 //return:true

但是当我尝试将其转换为小写时:object text2 = "test".ToLower();我得到了false的结果?

   object text1 = "test".ToLower();
   object text2 = "test".ToLower();
   Console.WriteLine("text1 == text2 : " + (text1 == text2));
   //return:false
2个回答

13
在第一个案例中,您正在使用引用相等性比较两个字符串,但这两个字符串是interned strings
在第二种情况下,当您在字符串上调用ToLower()时,它会创建一个新字符串,因此当使用引用相等性进行比较时,您将比较两个新的字符串实例,它们不是同一个实例。
如果您使用String.Equals方法进行比较,并且不使用Object.Equals,则会发现它将返回true,因为String.Equals将基于字符串内包含的值进行比较,而不是实际对象引用。

实际上,等号运算符针对的是,而不是引用:http://msdn.microsoft.com/en-us/library/system.string.op_equality.aspx - Andre Calil
好的,现在我已经看到了你的更新。对象的 == 确实是针对引用的。 - Andre Calil
1
@AndreCalil String.Equality 是使用值相等性的,但是 Object.Equals 使用引用相等性,这就是我所说的。 - Reed Copsey

2
我猜测这是因为您正在测试对象相等性,而不是字符串相等性。
也就是说,在第一个例子中,编译器已经将text1和text2的存储实际上变成了同一个对象,因为它们的内容相同。而在第二个例子中,ToLower()调用返回了新的对象,因此不再是同一个对象了。
如果您将声明的存储类型从object更改为string,您应该会看到期望的行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接