Record-like types & value-based equality (pattern)
Implement value-based equality like records: override Equals/GetHashCode, implement IEquatable , add ==/!= operators, and keep types immutable.
Record-like overview
Goal: Make objects compare by value (record-like) in C# 6.
- Immutable data
- Override Equals and GetHashCode
- Implement IEquatable<T>
- Optional: define ==/!=
Reference equality issue
Classes compare by reference by default. Two objects with the same data are not equal.
using System;
public class PersonRef
{
public string First;
public string Last;
}
public class Program
{
public static void Main(string[] args)
{
PersonRef a = new PersonRef { First = "Ada", Last = "Lovelace" };
PersonRef b = new PersonRef { First = "Ada", Last = "Lovelace" };
Console.WriteLine("Reference Equals? " + object.ReferenceEquals(a, b)); // false
Console.WriteLine("== (default)? " + (a == b)); // false (same as ReferenceEquals for classes)
}
}
All lessons in this course
- Structs: value semantics & immutability pattern
- Record-like types & value-based equality (pattern)
- Enums & [Flags]