System.Object.Equals 方法 (Object)

方法描述

确定指定的 Object 是否等于当前的 Object。

语法定义

public virtual bool Equals(
	Object obj
)

参数/返回值

参数值/返回值 参数类型/返回类型 参数描述/返回描述
obj System-Object 要与当前对象进行比较的对象。
返回值 System.Boolean 如果指定的 Object 等于当前的 Object,则为 true;否则为 false。

提示和注释

Equals 的默认实现支持引用相等性(对于引用类型)和按位相等性(对于值类型)。 引用相等性是指进行比较的多个对象引用所引用的是同一个对象。 按位相等性是指进行比较的多个对象具有相同的二进制表示形式。

请注意,派生类型可以重写 Equals 方法以实现值相等性。 值相等性是指所比较的对象具有相同的值,即使它们具有不同的二进制表示形式也是如此。 例如,请考虑两个分别表示数字 1.10 和 1.1000 的 Decimal 对象。 Decimal 对象不具有按位相等性,因为它们具有不同的二进制表示形式,因此会考虑不同数量的尾随零。 但是,这些对象具有值相等性,因为在进行比较时尾随零无关紧要,数字 1.10 和 1.1000 被视为相等。

对实现者的说明

此方法可由派生类重写。 例如,如果两个对象表示相同的值,则许多基数据类型返回 true;否则返回 false。

此方法仅比较基元和对象。 若要比较更复杂的结构(如对象数组),必须重写该方法。

下面的语句对于 Equals 方法的所有实现均必须为真。 在列表中,x、y 和 z 表示不为 null 的对象引用。

除涉及浮点型的情况外,x.Equals(x) 都返回 true。 请参见 IEC 60559:1989, Binary Floating-point Arithmetic for Microprocessor Systems。

x.Equals(y) 返回与 y.Equals(x) 相同的值。

如果 x 和 y 都为 NaN,则 x.Equals(y) 返回 true。

如果 (x.Equals(y) && y.Equals(z)) 返回 true,则 x.Equals(z) 返回 true。

只要不修改 x 和 y 引用的对象,对 x.Equals(y) 的相继调用将返回相同的值。

x.Equals(null) 返回 false。

有关属于 Equals 方法的其他必需行为,请参见 GetHashCode。

Equals 的实现必须不引发异常。

可通过调用 ReferenceEquals 方法比较当前对象与其他对象的引用相等性。 在 Visual Basic 中,您也可以使用 is 关键字(例如,If Me Is otherObject Then …)。

对于某些类型的对象,最好让 Equals 测试值相等性而非引用相等性。 如果两个对象具有相同的“值”,那么即使它们不是同一实例,这样的 Equals 实现仍返回 true。 类型实施者决定对象的“值”的构成,但这通常是存储在对象的实例变量中的部分或全部数据。 例如,String 的值基于字符串的字符;对于两个按同样的顺序包含完全相同的字符的字符串实例,String 类的 Equals 方法返回 true。

实现 IComparable 的类型必须重写 Equals。

重写 Equals 的类型也必须重写 GetHashCode;否则,Hashtable 可能不正常工作。

如果编程语言支持运算符重载,并且您选择了重载给定类型的相等运算符,则该类型必须重写 Equals 方法。 这样的 Equals 方法实现必须返回与相等运算符相同的结果。 遵照此准则有助于确保使用 Equals 的类库代码(如 ArrayList 和 Hashtable)的行为方式与应用程序代码使用的相等运算符的方式一致。

下面是针对实现值类型的准则:

考虑重写 Equals,以便在 ValueType 上获得比 Equals 的默认实现所提供的性能增强的性能。

如果重写 Equals 并且语言支持运算符重载,则必须重载值类型的相等运算符。

下面是针对实现引用类型的准则:

如果引用类型的语义是基于该类型表示某个(些)值的事实,则考虑对该类型重写 Equals。

即使大多数引用类型重写 Equals,它们也必须不能重载相等运算符。 但是,如果实现的引用类型想要具有值语义(如复杂的数字类型),则必须重写相等运算符。

System.Object.Equals 方法 (Object)例子

由于 Complex 为 C# 结构(值类型),所以不能从该类型派生;因此,Equals 方法不需要比较每个对象的 GetType 结果,而是可以改用 is 运算符来检查 obj 参数的类型。

using System;

public struct Complex {
   public double re, im;

   public override bool Equals(Object obj) {
      return obj is Complex && this == (Complex)obj;
   }

   public override int GetHashCode() {
      return re.GetHashCode() ^ im.GetHashCode();
   }

   public static bool operator ==(Complex x, Complex y) {
      return x.re == y.re && x.im == y.im;
   }

   public static bool operator !=(Complex x, Complex y) {
      return !(x == y);
   }
}

class MyClass {

  public static void Main() {
    Complex cmplx1, cmplx2;

    cmplx1.re = 4.0;
    cmplx1.im = 1.0;

    cmplx2.re = 2.0;
    cmplx2.im = 1.0;

    if (cmplx1 != cmplx2)
      Console.WriteLine("The two objects are not equal.");
    if (! cmplx1.Equals(cmplx2))
      Console.WriteLine("The two objects are not equal.");

    cmplx2.re = 4.0;

    if (cmplx1 == cmplx2) 
      Console.WriteLine("The two objects are now equal!");
    if (cmplx1.Equals(cmplx2)) 
      Console.WriteLine("The two objects are now equal!");
  }
}
// The example displays the following output:
//       The two objects are not equal.
//       The two objects are not equal.
//       The two objects are now equal!
//       The two objects are now equal!

异常

异常 异常描述

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。