この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

Object.Equals メソッド (Object)

 

公開日: 2016年10月

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。

名前空間:   System
アセンブリ:  mscorlib (mscorlib.dll 内)

public virtual bool Equals(
	object obj
)

パラメーター

obj
Type: System.Object

現在のオブジェクトと比較するオブジェクト。

戻り値

Type: System.Boolean

指定したオブジェクトが現在のオブジェクトと等しい場合は true。それ以外の場合は false

現在のインスタンス間の比較の種類とobjパラメーターは、現在のインスタンスは、参照型または値型かどうかによって異なります。

  • 現在のインスタンスが、参照型である場合、Equals(Object)参照の等価性のテストのメソッドを呼び出すと、Equals(Object)メソッドへの呼び出しには、ReferenceEqualsメソッドです。 参照の等価性は、比較されたオブジェクト変数が同じオブジェクトを参照していることを意味します。 次の例は、このような比較の結果を示しています。 定義、Personクラスは、参照型である、および呼び出し、Person新しい 2 つのインスタンス化するクラスのコンス トラクターPersonオブジェクト、person1aperson2、同じ値であります。 割り当てますperson1a別のオブジェクト変数にperson1bです。 例から出力としてperson1aperson1bが同じオブジェクトを参照するために等しい。 ただし、person1aperson2が、同じ値が等しくないです。

    using System;
    
    // Define a reference type that does not override Equals.
    public class Person
    {
       private string personName;
    
       public Person(string name)
       {
          this.personName = name;
       }
    
       public override string ToString()
       {
          return this.personName;
       }
    }
    
    public class Example
    {
       public static void Main()
       {
          Person person1a = new Person("John");
          Person person1b = person1a;
          Person person2 = new Person(person1a.ToString());
    
          Console.WriteLine("Calling Equals:"); 
          Console.WriteLine("person1a and person1b: {0}", person1a.Equals(person1b));               
          Console.WriteLine("person1a and person2: {0}", person1a.Equals(person2));  
    
          Console.WriteLine("\nCasting to an Object and calling Equals:");
          Console.WriteLine("person1a and person1b: {0}", ((object) person1a).Equals((object) person1b));
          Console.WriteLine("person1a and person2: {0}", ((object) person1a).Equals((object) person2)); 
       }
    }
    // The example displays the following output:
    //       person1a and person1b: True
    //       person1a and person2: False
    //       
    //       Casting to an Object and calling Equals:
    //       person1a and person1b: True
    //       person1a and person2: False
    
  • 現在のインスタンスが、値型である場合、Equals(Object)値の等価性のテストのメソッドです。 値の等価性には、次のことを意味します。

    • 2 つのオブジェクトでは、同じ型です。 次の例に示すように、 Byte 12 の値を持つオブジェクトが等しくない、Int32を 2 つのオブジェクトがある実行時の型が異なるため、12 の値を持つオブジェクト。

      using System;
      
      public class Example
      {
         public static void Main()
         {
            byte value1 = 12;
            int value2 = 12;
      
            object object1 = value1;
            object object2 = value2;
      
            Console.WriteLine("{0} ({1}) = {2} ({3}): {4}",
                              object1, object1.GetType().Name,
                              object2, object2.GetType().Name,
                              object1.Equals(object2));
         }
      }
      // The example displays the following output:
      //        12 (Byte) = 12 (Int32): False
      
    • 2 つのオブジェクトのパブリックおよびプライベート フィールドの値が等しいです。 次の例は、値の等価性をテストします。 定義、 Person 、構造体は値型と呼び出し、Person新しい 2 つのインスタンス化するクラスのコンス トラクターPersonオブジェクト、person1person2、同じ値であります。 2 つのオブジェクト変数、複数のオブジェクトを参照していますが、例からの出力が示すようperson1person2がプライベートの同じ値があるために等しいpersonNameフィールドです。

      using System;
      
      // Define a value type that does not override Equals.
      public struct Person
      {
         private string personName;
      
         public Person(string name)
         {
            this.personName = name;
         }
      
         public override string ToString()
         {
            return this.personName;
         }
      }
      
      public struct Example
      {
         public static void Main()
         {
            Person person1 = new Person("John");
            Person person2 = new Person("John");
      
            Console.WriteLine("Calling Equals:"); 
            Console.WriteLine(person1.Equals(person2)); 
      
            Console.WriteLine("\nCasting to an Object and calling Equals:");
            Console.WriteLine(((object) person1).Equals((object) person2));  
         }
      }
      // The example displays the following output:
      //       Calling Equals:
      //       True
      //       
      //       Casting to an Object and calling Equals:
      //       True
      

Objectクラスは、.NET Framework のすべての型の基本クラス、Object.Equals(Object)メソッドは、他のすべての種類の既定の等値比較を提供します。 ただし、型多くの場合、上書き、Equals値の等価性を実装するメソッド。 詳細については、の継承元のセクションでは呼び出し元関数とノートのノートを参照します。

呼び出すと、Equals(Object)のクラスのメソッドのオーバー ロード、 Windows ランタイム、しないをオーバーライドするクラスの既定の動作を提供Equals(Object)です。 これは、.NET Framework が Windows ランタイムに提供するサポートの一部です (「Windows ストア アプリおよび Windows ランタイムのための .NET Framework サポート」を参照してください)。 内のクラス、Windows ランタイム継承しないObject、現在実装していないと、Equals(Object)メソッドです。 ただし、それらがように見えますToStringEquals(Object)、およびGetHashCodeメソッド、c# または Visual Basic コードで使用すると、.NET Framework では、これらのメソッドの既定の動作です。

System_CAPS_noteメモ

Windows ランタイムc# または Visual Basic で記述されたクラスをオーバーライドして、Equals(Object)メソッドのオーバー ロードします。

派生クラスでオーバーライドよく、Object.Equals(Object)値の等価性を実装するメソッド。 さらに、型でもよくする追加の厳密に型指定されたオーバー ロードが提供、Equalsメソッドを実装することで、通常、IEquatable<T>インターフェイスです。 呼び出すと、Equals等しいかどうかをテストするメソッド、現在のインスタンスを上書きするかどうかを知っておくべきObject.Equalsに特定の呼び出し方法を理解して、Equalsメソッドが解決します。 それ以外の場合、意図したものとは異なる等価性テストを実行して、メソッドは、予期しない値を返す可能性があります。

具体的な例を次に示します。 3 つをインスタンス化StringBuilderオブジェクトと同一の文字列とを 4 つの呼び出しを行い、Equalsメソッドです。 最初のメソッドの呼び出しを返しますtrueと残りの 3 つの戻り値falseです。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      StringBuilder sb1 = new StringBuilder("building a string...");
      StringBuilder sb2 = new StringBuilder("building a string...");

      Console.WriteLine("sb1.Equals(sb2): {0}", sb1.Equals(sb2));
      Console.WriteLine("((Object) sb1).Equals(sb2): {0}", 
                        ((Object) sb1).Equals(sb2));
      Console.WriteLine("Object.Equals(sb1, sb2): {0}",
                        Object.Equals(sb1, sb2));      

      Object sb3 = new StringBuilder("building a string...");
      Console.WriteLine("\nsb3.Equals(sb2): {0}", sb3.Equals(sb2));                              
   }
}
// The example displays the following output:
//       sb1.Equals(sb2): True
//       ((Object) sb1).Equals(sb2): False
//       Object.Equals(sb1, sb2): False
//
//       sb3.Equals(sb2): False

最初の場合、厳密に型指定StringBuilder.Equals(StringBuilder)値の等価性テスト メソッドのオーバー ロードが呼び出されます。 2 つの文字列が割り当てられているためStringBuilderオブジェクトが等しい、メソッドが返されますtrueです。 ただし、StringBuilderをオーバーライドしませんObject.Equals(Object)です。 このため、ときに、StringBuilderオブジェクトにキャスト、Objectときに、StringBuilderインスタンスが型の変数に割り当てられたObjectとタイミング、Object.Equals(Object, Object)メソッドが渡される 2 つStringBuilderオブジェクト、既定値Object.Equals(Object)メソッドが呼び出されます。 StringBuilder 、参照型では、これは、2 つを渡すことに相当StringBuilderオブジェクトをReferenceEqualsメソッドです。 3 つすべてStringBuilderオブジェクトと同じ文字列を格納する、3 つの異なるオブジェクトを参照しています。 その結果、これら 3 つのメソッド呼び出しを返すfalseです。

現在のオブジェクトを別のオブジェクト参照の等価性を比較するには呼び出すことによって、ReferenceEqualsメソッドです。 Visual basic で使用することも、isキーワード (たとえば、 If Me Is otherObject Then ...)。

独自の型を定義すると、その型を継承によって定義されている機能、Equalsその基本型のメソッドです。 次の表に、既定の実装、 Equals .NET Framework の型の主なカテゴリのメソッドです。

型のカテゴリ

によって定義される等価性

コメント

直接派生したクラスObject

Object.Equals(Object)

参照の等価性です。呼び出すことと同じObject.ReferenceEqualsです。

構造体

ValueType.Equals

値の等価性です。直接比較するバイトでまたはリフレクションを使用してフィールドの比較できます。

列挙

Enum.Equals

値は、同じ列挙型と同じ基になる値が必要です。

Delegate

MulticastDelegate.Equals

デリゲートには、同一の呼び出しリストを持つ同じ型が必要です。

インターフェイス

Object.Equals(Object)

参照の等価性。

値型の場合は常にオーバーライドするEqualsリフレクションに依存する等値テスト パフォーマンスの低下を提供するため、します。 既定の実装を上書きすることもできます。Equals参照型の参照の等価性ではなく値の等価性をテストすると、値の等価性の正確な意味を定義します。 このような実装のEquals返すtrue同じインスタンスでない場合でも、2 つのオブジェクトが、同じ値があるかどうか。 型の実行者は、オブジェクトの値の構成内容を決定が、通常一部またはすべてのデータ オブジェクトのインスタンスの変数に格納します。 たとえばの値、Stringオブジェクトは、文字列の文字に基づいて、String.Equals(Object)メソッドのオーバーライド、Object.Equals(Object)を返すメソッドをtrue任意の 2 つの文字列と同じ順序で同じ文字が含まれているインスタンス。

次の例は、オーバーライドする方法を示します、Object.Equals(Object)値の等価性をテストするメソッド。 も優先、Equalsのメソッド、Personクラスです。 場合Personの等値をその基本クラス実装を受け入れる次の 2 つPersonオブジェクトは 1 つのオブジェクトを参照した場合にのみ、等価になります。 ただし、このケースでは、次の 2 つPersonオブジェクトが同じ値がある場合は等しく、Person.Idプロパティです。

public class Person
{
   private string idNumber;
   private string personName;

   public Person(string name, string id)
   {
      this.personName = name;
      this.idNumber = id;
   }

   public override bool Equals(Object obj)
   {
      Person personObj = obj as Person; 
      if (personObj == null)
         return false;
      else
         return idNumber.Equals(personObj.idNumber);
   }

   public override int GetHashCode()
   {
      return this.idNumber.GetHashCode(); 
   }
}

public class Example
{
   public static void Main()
   {
      Person p1 = new Person("John", "63412895");
      Person p2 = new Person("Jack", "63412895");
      Console.WriteLine(p1.Equals(p2));
      Console.WriteLine(Object.Equals(p1, p2));
   }
}
// The example displays the following output:
//       True
//       True

オーバーライドするだけでなくEquals、実装することができます、IEquatable<T>等値の厳密に型指定されたテストを提供するインターフェイスです。

次のステートメントは、のすべての実装の場合は true である必要があります、Equals(Object)メソッドです。 一覧で、 xy、およびzれていないオブジェクト参照を表すnullです。

  • x.Equals(x)返しますtrue、浮動小数点型に関連する場合は除きます。 ISO と IEC/IEEE 60559:2011、情報テクノロジ--マイクロプロセッサ システムであり、浮動小数点算術演算子を参照してください。

  • x.Equals(y)同じ値を返しますy.Equals(x)です。

  • x.Equals(y)返しますtrue両方xyNaNします。

  • 場合(x.Equals(y) && y.Equals(z))返しますtrue、しx.Equals(z)返しますtrueです。

  • 連続して呼び出すx.Equals(y)によってオブジェクトが参照されている限り、同じ値を返すxyは変更されません。

  • x.Equals(null) は、false を返します。

実装Equalsは例外をスローする必要がありますいないそれらは常に値を返します。 たとえば場合、objnullEqualsメソッドが返すfalseスローする代わりに、ArgumentNullExceptionです。

オーバーライドする場合は、次のガイドラインをに従ってEquals(Object):

  • 型を実装するIComparableオーバーライドする必要がありますEquals(Object)です。

  • 型のオーバーライドがEquals(Object)もオーバーライドしなければなりませんGetHashCode以外の場合、ハッシュ テーブルが正しく動作しません。

  • 実装を検討する必要があります、IEquatable<T>強くをサポートするインターフェイスが等しいかどうかのテストを入力します。 IEquatable<T>.Equals実装と一貫性のある結果を返す必要がありますEqualsです。

  • 場合は、プログラミング言語は、演算子のオーバー ロードをサポートしている、特定の型に対して、等値演算子をオーバー ロードして、上書きすることも必要があります、Equals(Object)等値演算子と同じ結果を返すメソッド。 これにより、そのクラス ライブラリのコードを使用するEquals(などArrayListHashtable) は、アプリケーション コードで、等値演算子を使用する方法と一致するように動作します。

オーバーライドするのに次のガイドラインが適用Equals(Object)参照型。

  • オーバーライドを検討してくださいEquals場合は、型のセマンティクスは、という事実に基づいて、種類がいくつかの値を表します。

  • ほとんどの参照型である必要がありますをオーバーライドする場合でもを等値演算子オーバー ロードしないEqualsです。 ただしなど、複雑な数値型の値のセマンティクスを持つものでは参照型を実装している場合は、等値演算子をオーバーライドする必要があります。

  • オーバーライドしないでくださいEquals変更可能な参照型にします。 これは、オーバーライドするためEqualsオーバーライドすることも必要があります、GetHashCodeメソッド、前のセクションで説明したようにします。 つまり、変更可能な参照型のインスタンスのハッシュ コードが、ハッシュ テーブルで、オブジェクトが失われた可能性がありますが、有効期間中に変更できます。

オーバーライドするのに次のガイドラインが適用Equals(Object)値の型に対して。

  • 1 つまたは複数のフィールドを含む値の型を定義している場合は参照型の値が、オーバーライドする必要がありますEquals(Object)です。 Equals(Object)で提供される実装ValueType値型がバイト単位の比較を実行のフィールドは、すべての値の型がリフレクションを使用して、その結果、フィールドが参照型を含む値の型のフィールドの比較を実行します。

  • オーバーライドする場合はEquals開発言語には、演算子のオーバー ロードがサポートしていると、等値演算子をオーバー ロードする必要があります。

  • 実装する必要があります、IEquatable<T>インターフェイスです。 厳密に型を呼び出すIEquatable<T>.Equalsメソッドは、ボックス化を回避できます、obj引数。

例を次に、Pointをオーバーライドするクラス、Equals値の等価性を提供するメソッドとPoint3Dから派生したクラスをPointです。 PointオーバーライドObject.Equals(Object)値の等価性をテストする、Object.Equals(Object)メソッドは呼び出されません。 ただし、Point3D.Equals呼び出しPoint.EqualsためPoint実装Object.Equals(Object)で値の等価性を提供できるようにします。

using System;

class Point
{
   protected int x, y;

   public Point() : this(0, 0) 
   { }

   public Point(int x, int y) 
   {
      this.x = x;
      this.y = y;
   }

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

   public override int GetHashCode() 
   {
      return (x << 2) ^ y;
   }

    public override string ToString()
    {
        return String.Format("Point({0}, {1})", x, y);
    }
}

sealed class Point3D: Point 
{
   int z;

   public Point3D(int x, int y, int z) : base(x, y) 
   {
      this.z = z; 
   }

   public override bool Equals(Object obj) 
   {
      Point3D pt3 = obj as Point3D;
      if (pt3 == null)
         return false;
      else
         return base.Equals((Point)obj) && z == pt3.z;
   }

   public override int GetHashCode() 
   {
      return (base.GetHashCode() << 2) ^ z;
   }

   public override String ToString() 
   {
        return String.Format("Point({0}, {1}, {2})", x, y, z);
    }
}

class Example 
{
  public static void Main() 
  {
     Point point2D = new Point(5, 5);
     Point3D point3Da = new Point3D(5, 5, 2);
     Point3D point3Db = new Point3D(5, 5, 2);
     Point3D point3Dc = new Point3D(5, 5, -1);

     Console.WriteLine("{0} = {1}: {2}", 
                       point2D, point3Da, point2D.Equals(point3Da));
     Console.WriteLine("{0} = {1}: {2}", 
                       point2D, point3Db, point2D.Equals(point3Db));        
     Console.WriteLine("{0} = {1}: {2}", 
                       point3Da, point3Db, point3Da.Equals(point3Db));
     Console.WriteLine("{0} = {1}: {2}", 
                       point3Da, point3Dc, point3Da.Equals(point3Dc));
  } 
}
// The example displays the following output:
//       Point(5, 5) = Point(5, 5, 2): False
//       Point(5, 5) = Point(5, 5, 2): False
//       Point(5, 5, 2) = Point(5, 5, 2): True
//       Point(5, 5, 2) = Point(5, 5, -1): False

The Point.Equals method checks to make sure that the obj argument is not null and that it references an instance of the same type as this object. If either check fails, the method returns false.

The Point.Equals method calls the M:System.Object.GetType method to determine whether the run-time types of the two objects are identical. If the method used a check of the form obj is Point in C# or TryCast(obj, Point) in Visual Basic, 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 run-time 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 fields of the two objects.

In Point3D.Equals, the inherited Point.Equals method, which overrides M:System.Object.Equals(System.Object), is invoked before anything else is done. Because Point3D is a sealed class (NotInheritable in Visual Basic), a check in the form obj is Point in C# or TryCast(obj, Point) in Visual Basic is adequate to ensure that obj is a Point3D object. If it is a Point3D object, it is cast to a Point object and passed to the base class implementation of M:System.Object.Equals(System.Object). Only when the inherited Point.Equals method returns true does the method compare the z instance fields introduced in the derived class.

次の例では定義、Rectangleとして 2 つの四角形を内部的に実装するクラスPointオブジェクト。 Rectangleクラスも上書きObject.Equals(Object)値の等価性を提供します。

using System;

class Rectangle 
{
   private Point a, b;

   public Rectangle(int upLeftX, int upLeftY, int downRightX, int downRightY) {
      this.a = new Point(upLeftX, upLeftY);
      this.b = new Point(downRightX, downRightY);
   }

   public override bool Equals(Object obj) {
      // Perform an equality check on two rectangles (Point object pairs).
      if (obj == null || GetType() != obj.GetType()) 
          return false;
      Rectangle r = (Rectangle)obj;
      return a.Equals(r.a) && b.Equals(r.b);
   }

   public override int GetHashCode() {
      return Tuple.Create(a, b).GetHashCode();
   }

    public override String ToString() 
    {
       return String.Format("Rectangle({0}, {1}, {2}, {3})",
                            a.x, a.y, b.x, b.y); 
    }
}

class Point 
{
  internal int x;
  internal int y;

  public Point(int X, int Y) {
     this.x = X;
     this.y = Y;
  }

  public override bool Equals (Object obj) {
     // Performs an equality check on two points (integer pairs).
     if (obj == null || GetType() != obj.GetType()) return false;
     Point p = (Point)obj;
     return (x == p.x) && (y == p.y);
  }

  public override int GetHashCode() {
     return Tuple.Create(x, y).GetHashCode();
  }
}

class Example 
{
   public static void Main() 
   {
      Rectangle r1 = new Rectangle(0, 0, 100, 200);
      Rectangle r2 = new Rectangle(0, 0, 100, 200);
      Rectangle r3 = new Rectangle(0, 0, 150, 200);

      Console.WriteLine("{0} = {1}: {2}", r1, r2, r1.Equals(r2));
      Console.WriteLine("{0} = {1}: {2}", r1, r3, r1.Equals(r3));
      Console.WriteLine("{0} = {1}: {2}", r2, r3, r2.Equals(r3));
   }
}
// The example displays the following output:
//    Rectangle(0, 0, 100, 200) = Rectangle(0, 0, 100, 200): True
//    Rectangle(0, 0, 100, 200) = Rectangle(0, 0, 150, 200): False
//    Rectangle(0, 0, 100, 200) = Rectangle(0, 0, 150, 200): False

C# および Visual Basic などの一部の言語には、演算子のオーバー ロードがサポートされます。 オーバーライドする必要がありますも、型は、等値演算子をオーバー ロード、ときに、Equals(Object)同じ機能を提供するメソッド。 一般に記述して、Equals(Object)次の例のように、オーバー ロードされた等値演算子の観点からのメソッドです。

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 Tuple.Create(re, 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);
   }

    public override String ToString()
    {
       return String.Format("({0}, {1})", re, im);
    } 
}

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;

    Console.WriteLine("{0} <> {1}: {2}", cmplx1, cmplx2, cmplx1 != cmplx2);        
    Console.WriteLine("{0} = {1}: {2}", cmplx1, cmplx2, cmplx1.Equals(cmplx2));        

    cmplx2.re = 4.0;

    Console.WriteLine("{0} = {1}: {2}", cmplx1, cmplx2, cmplx1 == cmplx2);        
    Console.WriteLine("{0} = {1}: {2}", cmplx1, cmplx2, cmplx1.Equals(cmplx2));          
  }
}
// The example displays the following output:
//       (4, 1) <> (2, 1): True
//       (4, 1) = (2, 1): False
//       (4, 1) = (4, 1): True
//       (4, 1) = (4, 1): True

Because Complex is a value type, it cannot be derived from. Therefore, the override to M:System.Object.Equals(System.Object) method need not call M:System.Object.GetType to determine the precise run-time type of each object, but can instead use the is operator in C# or the TypeOf operator in Visual Basic to check the type of the obj parameter.

ユニバーサル Windows プラットフォーム
8 以降で使用可能
.NET Framework
1.1 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Silverlight
2.0 以降で使用可能
Windows Phone Silverlight
7.0 以降で使用可能
Windows Phone
8.1 以降で使用可能
トップに戻る
表示: