字符串,作为引用类型的行为类似于值类型

时间:2012-12-05 17:32:21

标签: c# string reference equality

        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。为什么在字符串中观察到这种异常行为?

3 个答案:

答案 0 :(得分:3)

这里有两件事。

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

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

答案 1 :(得分: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;
    }
}

答案 2 :(得分:2)

MSDN string

  

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