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

Pri*_*kar 8 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
Run Code Online (Sandbox Code Playgroud)

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

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

        Console.WriteLine(s1.Equals(s2)); // returning true
        Console.WriteLine(object.Equals(s1, s2)); // returning false
Run Code Online (Sandbox Code Playgroud)

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

Eri*_* J. 7

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

如果你正在比较字符串文字(在你的例子中不是这种情况),值得注意的是相同的字符串文字是被实现的 ......也就是说,相同的字符串存在于同一个地址,因此也将通过引用相等(例如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具有相等的字符串,容量和MaxCapacity值,则返回true;否则返回false.否则,错误.

object.Equals()使用在对象上定义静态Equals(),它仅检查引用相等性(如果传递一个类)或值相等(如果传递一个struct).

所以总结一下

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)
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,StringBuilder只重载Equals方法而不覆盖虚拟object.Equals(object).这就是两种方法表现不同的原因.我想知道他们是否忘了在NET1.0中这样做并且不想引入一个突破性的变化? (5认同)