Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Differences between operator ==, StringBuilder.Equals, Object.Equals and Object.ReferenceEquals

I have a question about Object.Equals and Equals(object). My sample code is below:

class Program
{
    static void Main(string[] args)
    {
        var sb1 = new StringBuilder("Food");
        var sb2 = new StringBuilder("Food");
        Console.WriteLine(sb1 == sb2);
        Console.WriteLine(sb1.Equals(sb2));
        Console.WriteLine(Object.Equals(sb1, sb2));
        Console.WriteLine(Object.ReferenceEquals(sb1, sb2));
        Console.ReadLine();
    }
}

The output is:

False
True
False
False

But as far as I'm concerned Object.Equals(sb1, sb2) internally calls sb1.Equals(sb2) so why does it give two different results?

like image 429
amitabha Avatar asked Sep 10 '25 20:09

amitabha


1 Answers

You are missing another test:

Console.WriteLine(sb1.Equals((object)sb2)); // False!

StringBuilder does not override Equals(object), it overloads it with another Equals(StringBuilder).

Object.Equals(object, object) is calling Equals(object), so the result is false.

like image 148
Kobi Avatar answered Sep 12 '25 09:09

Kobi