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.

Advertisements

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 )

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s

ultimatemindsettoday

A great WordPress.com site

Elliot Balynn's Blog

A directory of wonderful thoughts

Robin Sedlaczek's Blog

Developer on Microsoft Technologies

HarsH ReaLiTy

A Good Blog is Hard to Find

Softwarearchitektur in der Praxis

Wissenswertes zu Webentwicklung, Domain-Driven Design und Microservices

the software architecture

thoughts, ideas, diagrams,enterprise code, design pattern , solution designs

Technology Talks

on Microsoft technologies, Web, Android and others

Software Engineering

Web development

Disparate Opinions

Various tidbits

chsakell's Blog

Anything around ASP.NET MVC,WEB API, WCF, Entity Framework & AngularJS

Cyber Matters

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

Guru N Guns's

OneSolution To dOTnET.

Johnny Zraiby

Measuring programming progress by lines of code is like measuring aircraft building progress by weight.

%d bloggers like this: