Implementing equality of derived reference types by overriding the == operator with C# .NET
May 20, 2015 1 Comment
In this post we saw one solution to override the == operator for a reference type to implement equality checking. Here’s a reminder of the Person class:
public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public static bool operator ==(Person personOne, Person personTwo) { return personOne.Id == personTwo.Id; } public static bool operator !=(Person personOne, Person personTwo) { return personOne.Id != personTwo.Id; } public override int GetHashCode() { return Id; } }
The below code will print true:
Person personOne = new Person() { Age = 6, Name = "Eva", Id = 1 }; Person personTwo = new Person() { Age = 6, Name = "Eva", Id = 1 }; Console.WriteLine(personOne == personTwo);
That’s fine but what if we have a derived class, such as this one:
public class Employee : Person { public int EmployeeId { get; set; } }
Let’s see an example:
Employee employeeOne = new Employee() { Age = 20, Name = "John", Id = 10, EmployeeId = 2 }; Employee employeeTwo = new Employee() { Age = 20, Name = "John", Id = 10, EmployeeId = 2 }; Console.WriteLine(employeeOne == employeeTwo);
This code will call the == operator of the Person superclass. As the equality of the Person object is based on Person.Id the above code will print true as the two objects are deemed equal.
That’s fine if even the derived classes should follow the same equality check. However, what if the Employee equality should be based on the employee ID instead? One solution is to override the == and != operators directly in the Employee class as well:
public class Employee : Person { public int EmployeeId { get; set; } public static bool operator ==(Employee employeeOne, Employee employeeTwo) { return employeeOne.EmployeeId == employeeTwo.EmployeeId; } public static bool operator !=(Employee employeeOne, Employee employeeTwo) { return employeeOne.EmployeeId != employeeTwo.EmployeeId; } }
If you change the Id properties of the Employee objects they will still be deemed equal since their EmployeeId fields are equal.
View all various C# language feature related posts here.
Reblogged this on Dinesh Ram Kali..