This documentation is archived and is not being maintained.

Object.Equals Method (Object)

Updated: October 2010

Determines whether the specified Object is equal to the current Object.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

public function Equals(
	obj : Object
) : boolean


Type: System.Object

The Object to compare with the current Object.

Return Value

Type: System.Boolean
true if the specified Object is equal to the current Object; otherwise, false.

The default implementation of Equals supports reference equality for reference types, and bitwise equality for value types. Reference equality means the object references that are compared refer to the same object. Bitwise equality means the objects that are compared have the same binary representation.

Note that a derived type might override the Equals method to implement value equality. Value equality means the compared objects have the same value even though they have different binary representations. For example, consider two Decimal objects that represent the numbers 1.10 and 1.1000. The Decimal objects do not have bitwise equality because they have different binary representations to account for the different number of trailing zeroes. However, the objects have value equality because the numbers 1.10 and 1.1000 are considered equal for comparison purposes since the trailing zeroes are insignificant.

Notes to Implementers:

This method can be overridden by a derived class. For example, many of the base data types return true if both objects represent the same value; otherwise, false.

This method only compares primitives and objects. It must be overridden to compare more complex structures, such as arrays of objects.

The following statements must be true for all implementations of the Equals method. In the list, x, y, and z represent object references that are not a null reference (Nothing in Visual Basic).

  • x.Equals(x) returns true, except in cases that involve floating-point types. See IEC 60559:1989, Binary Floating-point Arithmetic for Microprocessor Systems.

  • x.Equals(y) returns the same value as y.Equals(x).

  • x.Equals(y) returns true if both x and y are NaN.

  • If (x.Equals(y) && y.Equals(z)) returns true, then x.Equals(z) returns true.

  • Successive calls to x.Equals(y) return the same value as long as the objects referenced by x and y are not modified.

  • x.Equals(a null reference (Nothing in Visual Basic)) returns false.

See GetHashCode for additional required behaviors pertaining to the Equals method.

Implementations of Equals must not throw exceptions.

You can compare the current object to another object for reference equality by using the this keyword in C# (for example, if (this == otherObj)) or the Me keyword in Visual Basic (for example, If Me Is otherObject Then …).

For some kinds of objects, it is desirable to have Equals test for value equality instead of referential equality. Such implementations of Equals return true if the two objects have the same "value", even if they are not the same instance. The type's implementer decides what constitutes an object's "value", but it is typically some or all the data stored in the instance variables of the object. For example, the value of a String is based on the characters of the string; the Equals method of the String class returns true for any two string instances that contain exactly the same characters in the same order.

Types that implement IComparable must override Equals.

Types that override Equals must also override GetHashCode; otherwise, Hashtable might not work correctly.

If your programming language supports operator overloading and if you choose to overload the equality operator for a given type, that type must override the Equals method. Such implementations of the Equals method must return the same results as the equality operator. Following this guideline will help ensure that class library code using Equals (such as ArrayList and Hashtable) behaves in a manner that is consistent with the way the equality operator is used by application code.

The following guidelines are for implementing a value type:

  • Consider overriding Equals to gain increased performance over that provided by the default implementation of Equals on ValueType.

  • If you override Equals and the language supports operator overloading, you must overload the equality operator for your value type.

The following guidelines are for implementing a reference type:

  • Consider overriding Equals on a reference type if the semantics of the type are based on the fact that the type represents some value(s).

  • Most reference types must not overload the equality operator, even if they override Equals. However, if you are implementing a reference type that is intended to have value semantics, such as a complex number type, you must override the equality operator.

The following code example compares the current instance with another object.

No code example is currently available or this language may not be supported.

The following example shows a Point class that overrides the Equals method to provide value equality and a class Point3D, which is derived from Point. Because Point 's override of Equals is the first in the inheritance chain to introduce value equality, the Equals method of the base class (which is inherited from Object and checks for referential equality) is not invoked. However, Point3D.Equals invokes Point.Equals because Point implements Equals in a manner that provides value equality.

import System;
import System.Drawing

class Point extends Object {
   var x : int;
   var y : int;

   public override function Equals(obj : Object) : Boolean {
      //Check for null and compare run-time types.
      if (obj == null || GetType() != obj.GetType()){
           return false;
      var p : Point = Point(obj);
      return (x == p.x) && (y == p.y);

   public override function GetHashCode() : int {
      return x ^ y;

class Point3D extends Point {
   var z : int;

   public override function Equals(obj : Object) : Boolean{
      return super.Equals(obj) && z == (Point3D(obj)).z;

   public override function GetHashCode() : int {
      return super.GetHashCode() ^ z;

The Point.Equals method checks that the obj argument is not a null reference (Nothing in Visual Basic) and that it references an instance of the same type as this object. If either of those checks fail, the method returns false.

The Equals method uses GetType to determine whether the run-time types of the two objects are identical. (Note that typeof is not used here because it returns the static type.) If the method used a check of the form obj is Point, the check would return true in cases where obj is an instance of a derived class of Point, even though obj and the current instance are not of the same runtime type. Having verified that both objects are of the same type, the method casts obj to type Point and returns the result of comparing the instance variables of the two objects.

In Point3D.Equals, the inherited Equals method is invoked before anything else is done; the inherited Equals method checks to see that obj is not a null reference (Nothing in Visual Basic), that obj is an instance of the same class as this object and that the inherited instance variables match. Only when the inherited Equals returns true does the method compare the instance variables introduced in the derived class. Specifically, the cast to Point3D is not executed unless obj has been determined to be of type Point3D or a derived class of Point3D.

In the previous example, the equality operator is used to compare the individual instance variables. In some cases, it is appropriate to use the Equals method to compare instance variables in an Equals implementation, as shown in the following code example.

import System;
import System.Drawing;

class Rectangle {
   var a : Point;
   var b : Point;

   public override function Equals(obj : Object) : Boolean {
      if (obj == null || GetType() != obj.GetType()) {
           return false;

      var r : Rectangle = Rectangle(obj);
      //Uses Equals to compare variables.
      return a.Equals(r.a) && b.Equals(r.b);

   public override function GetHashCode() : int {
      return a.GetHashCode() ^ b.GetHashCode();

In some languages, such as C# and Visual Basic, operator overloading is supported. When a type overloads the equality operator, it must also override the Equals method to provide the same functionality. This is typically accomplished by writing the Equals method in terms of the overloaded equality, as in the following code example.

No code example is currently available or this language may not be supported.

Because Complex is a value type, it cannot be derived from; therefore, the Equals method need not compare the GetType results for each object, but can instead use the is operator to check the type of the obj parameter.

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360, Zune

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

.NET Framework

Supported in: 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Supported in: 3.5, 2.0, 1.0

XNA Framework

Supported in: 3.0, 2.0, 1.0




October 2010

Revised the last example.

Customer feedback.