Sobes.tech
Middle

What exactly are we comparing when working with reference types in C#?

sobes.tech AI

Answer from AI

When comparing reference types in C#, by default, references to objects in memory are compared, not the contents of the objects themselves.

This means that object1 == object2 will only be true if object1 and object2 point to the same instance in the heap.

To compare the contents of reference type objects, the following are used:

  • Overriding the Object.Equals() method.
  • Implementing the IEquatable<T> interface.
  • Using the static method Object.Equals().
  • Using the static method Object.ReferenceEquals().
// Example of reference comparison
string s1 = "hello";
string s2 = "hello";
string s3 = s1;

Console.WriteLine(s1 == s2); // Might be true due to string interning
Console.WriteLine(object.ReferenceEquals(s1, s2)); // Usually false (different instances)
Console.WriteLine(s1 == s3); // true (same reference)
Console.WriteLine(object.ReferenceEquals(s1, s3)); // true (same reference)

// Example of content comparison
class MyClass : IEquatable<MyClass>
{
    public int Value { get; set; }

    public override bool Equals(object obj)
    {
        return Equals(obj as MyClass);
    }

    public bool Equals(MyClass other)
    {
        if (other == null)
            return false;
        return Value == other.Value;
    }

    public override int GetHashCode()
    {
        return Value.GetHashCode();
    }
}

MyClass mc1 = new MyClass { Value = 10 };
MyClass mc2 = new MyClass { Value = 10 };
MyClass mc3 = mc1;

Console.WriteLine(mc1 == mc2); // false (different references)
Console.WriteLine(mc1.Equals(mc2)); // true (comparing contents)
Console.WriteLine(object.Equals(mc1, mc2)); // true (comparing contents)
Console.WriteLine(object.ReferenceEquals(mc1, mc3)); // true (same reference)