C# Default Equals behavior

Equals is declared in the Object class itself.

public virtual bool Equals(Object obj);

By default, Equals has the following behavior:

  • If the instance is a reference type, then Equals will return true only if the references are the same.
  • If the instance is a value type, then Equals will return true only if the type and value are the same.
  • string is a special case. It behaves like a value type.
namespace ConsoleApplication


public class Program


public static void Main(string[] args)


//areFooClassEqual: False

Foo fooClass1 = new Foo("42");

Foo fooClass2 = new Foo("42");

bool areFooClassEqual = fooClass1.Equals(fooClass2);

Console.WriteLine("fooClass1 and fooClass2 are equal: {0}", areFooClassEqual); //False

//areFooIntEqual: True

int fooInt1 = 42;

int fooInt2 = 42;

bool areFooIntEqual = fooInt1.Equals(fooInt2);

Console.WriteLine("fooInt1 and fooInt2 are equal: {0}", areFooIntEqual);

//areFooStringEqual: True

string fooString1 = "42";

string fooString2 = "42";

bool areFooStringEqual = fooString1.Equals(fooString2);

Console.WriteLine("fooString1 and fooString2 are equal: {0}", areFooStringEqual);



public class Foo


public string Bar { get; }

public Foo(string bar)


Bar = bar;



C# Creating a new console application (Visual Studio)