0
        string s1 = "hi";
        string s2 = "hi";
        bool x = (s1 == s2);
        Console.WriteLine(bool.Parse(""+x)); //printed as true and my point of interest
        x = s1.Equals(s2);
        Console.WriteLine(bool.Parse("" + x));//printed as true
        s1 = s2;
        x = (s1 == s2);
        Console.WriteLine(bool.Parse("" + x));//printed as true
        x = s1.Equals(s2);
        Console.WriteLine(bool.Parse("" + x));//printed as true  

由于s1==s2比较引用,它应该返回为 false。但我得到的输出是真的。我仅在字符串的情况下观察到这一点。当对其他类的对象执行此操作时,它正确地评估为 false。为什么在字符串中观察到这种异常行为?

4

3 回答 3

3

这里有两件事。

首先是字符串类型重载了 == 运算符。== 运算符的引用比较只是默认行为。任何类型都可以重载该运算符以获得更好的语义。如果要保证引用相等,请使用该ReferenceEquals()方法。

第二个是所谓的interning,它允许具有相同值的两个不同字符串变量引用同一个对象。实习意味着即使没有重载 == 运算符,如果两个变量都实习了“hi”文字,则 == 和 ReferenceEquals() 比较仍然可以返回 true

于 2012-12-05T17:35:13.703 回答
2

由于 s1==s2 比较引用

这是一个错误的假设。你可以重载==操作符来做任何你想做的事情。

这是您如何为自己的课程重载它的方法,就像这样String做一样。

public class Foo
{
    public int Value { get; set; }
    public static bool operator ==(Foo first, Foo second)
    {
        return first.Value == second.Value;
    }
}
于 2012-12-05T17:33:48.850 回答
2

MSDN 字符串

尽管字符串是一种引用类型,但相等运算符(== 和 !=)被定义为比较字符串对象的,而不是引用(7.9.7 字符串相等运算符)。这使得对字符串相等性的测试更加直观。

于 2012-12-05T17:34:20.643 回答