为什么object.Equals和instanceobject.Equals不相同

时间:2012-03-19 01:31:46

标签: c# string stringbuilder

        string s1 = "t";
        string s2 = 't'.ToString();        

        Console.WriteLine(s1.Equals(s2)); // returning true
        Console.WriteLine(object.Equals(s1, s2)); // returning true

这里返回相同的结果。现在,当我使用StringBuilder时,它没有返回相同的值。什么是底层的原因?

        StringBuilder s1 = new StringBuilder();
        StringBuilder s2 = new StringBuilder();

        Console.WriteLine(s1.Equals(s2)); // returning true
        Console.WriteLine(object.Equals(s1, s2)); // returning false

Edit1 :我的上述问题在下面得到了解答。但在本次讨论中,我们发现StringBuilder在其实现中没有任何覆盖Equals方法。所以当我们调用StringBuilder.Equals时,实际上它会转到Object.Equals。因此,如果有人调用StringBuilder.Equals和S1.Equals(S2),结果将会有所不同。

3 个答案:

答案 0 :(得分:7)

在C#中覆盖

String.Equals(),以便在使用Equal()上定义的Equal()覆盖时,相同的字符串实际为string

如果你要比较string literals(不是你的例子中的情况),值得注意的是,相同的字符串文字是interned ...也就是说,相同的字符串同时存在address so也等于引用(例如object.Equals()或s1.ReferenceEquals(s2))以及值。

StringBuilder为Equals()提供了一个重载,它将StringBuilder作为参数(s1.Equals(s2)将调用该重载而不是调用object.Equals(object obj))。

http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.equals.aspx

StringBuilder.Equals()是......

  

如果此实例和sb具有相等的字符串,容量和,则为true   MaxCapacity值;否则,错误。

object.Equals()使用static Equals() defined on object,它只检查引用相等性(如果传递一个类)或value equality(如果传递一个结构)。

总结

string s1 = "t";
string s2 = 't'.ToString();        

Console.WriteLine(s1.Equals(s2)); // true because both reference equality (interned strings) and value equality (string overrides Equals())
Console.WriteLine(object.Equals(s1, s2)); // true because of reference equality (interned strings)

StringBuilder s1 = new StringBuilder();
StringBuilder s2 = new StringBuilder();

Console.WriteLine(s1.Equals(s2)); // true because StringBuilder.Equals() overloaded
Console.WriteLine(object.Equals(s1, s2)); // false because the two StringBuilder instances have different addresses (references not equal)

答案 1 :(得分:1)

generic Equals method比较两个对象的引用,以查看它们是否具有引用相等的引用类型,例如StringBuilder。对于值类型,string的行为类似于值类型(不可变),它执行按位比较(确定二进制表示是否相同)。但是,此功能在StringBuilder类中重载。

根据MSDN,如果两个StringBuilder对象的以下条件相等,则StringBuilder的equal方法将返回true:

  • 字符串
  • 容量
  • MAXCAPACITY

因此,第二个示例中的s1和s2失败了引用相等,但是根据刚刚提到的条件传递了自定义StringBuilder Equals相等。

答案 2 :(得分:1)

字符串类以比较字符串值的方式实现Equals。

大多数对象实例,除非它们实现不同类型的比较,否则检查对象引用是否相同。

请注意,还有一种情况,即编译器最初将两个包含完全相同值的不同字符串常量分配给同一个对象引用。