Implementing equality of derived reference types by overriding the == operator with C# .NET

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.

Advertisement

About Andras Nemes
I'm a .NET/Java developer living and working in Stockholm, Sweden.

One Response to Implementing equality of derived reference types by overriding the == operator with C# .NET

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Elliot Balynn's Blog

A directory of wonderful thoughts

Software Engineering

Web development

Disparate Opinions

Various tidbits

chsakell's Blog

WEB APPLICATION DEVELOPMENT TUTORIALS WITH OPEN-SOURCE PROJECTS

Once Upon a Camayoc

Bite-size insight on Cyber Security for the not too technical.

%d bloggers like this: