내보내기(0) 인쇄
모두 확장
이 문서는 기계로 번역한 것입니다. 원본 텍스트를 보려면 포인터를 문서의 문장 위로 올리십시오. 추가 정보
번역
원본

Object.Equals 메서드 (Object)

지정한 개체가 현재 개체와 같은지 여부를 확인합니다.

네임스페이스:  System
어셈블리:  mscorlib(mscorlib.dll)

public virtual bool Equals(
	Object obj
)

매개 변수

obj
형식: System.Object
현재 개체와 비교할 개체입니다.

반환 값

형식: System.Boolean
지정한 개체가 현재 개체와 같으면 true이고, 그렇지 않으면 false입니다.

현재 인스턴스와 obj 매개 변수사이의 비교 형식은 현재 인스턴스 참조 형식 또는 값 형식에 따라 달라 집니다.

  • 현재 인스턴스 참조 형식인 경우, Equals(Object) 메소드 참조 일치에 대해 시험합니다. 그리고 호출 Equals(Object) 메서드는 ReferenceEquals 메서드와 동등합니다. 참조 일치는 비교되는 개체 참조가 동일한 개체를 참조함을 의미합니다. 다음 예제에서는 이러한 비교의 결과를 보여 줍니다. Person 클래스를 정의할 경우, 이는 참조 형식인 클래스이고 Person 클래스 생성자를 호출합니다. 이는 Person 개체 및 person1a 와 동일한 값을 가지는 person2를 예를 들어 설명하기 위함입니다. 또한 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) 메서드 값이 같은지 테스트 합니다. 다음 값이 같은지를 의미합니다.

    • 두 개체는 같은 종류입니다. 다음 예제와 같이 볼 수 있습니다, Byte 개체는 같지 않은 12의 값이 있습니다. 이는 Int32 두 개체가 서로 다른 런타임 형식 때문에 값이 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
      
      
      
    • 두 개체의 공용 및 전용 필드의 값이 같습니다. 다음 예제에서 값이 같은지 테스트합니다. Person 클래스를 정의할 경우, 이는 참조 형식인 클래스이고 Person 클래스 생성자를 호출합니다. 이는 Person 개체 및 person1 과 동일한 값을 가지는 person2를 예를 들어 설명하기 위함입니다. 두 개체 변수가 서로 다른 개체를 참조 하지만 예제 출력에서 볼 수 있듯이 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 값 일치를 구현 하는 메서드입니다. 자세한 내용은 상속자 참고 섹션에대한 호출자 및 메모에 대한 정보를 참조합니다.

이 Windows 런타임를 주목하십시오.

Equals(Object) 메소드는 클래스에서 Windows 런타임 를 오버 로드하는 것을 호출합니다. 기본 동작을 재정의 하지 않는 클래스에 대하여 Equals(Object) 를 재정의하는 것을 제공합니다. 이는 .NET Framework에서 Windows 런타임에 대해 제공하는 지원의 일부입니다(Windows 스토어 앱 및 Windows 런타임에 대한 .NET Framework 지원 참조). Windows 런타임 에서 클래스는 Object 를 상속하지 않습니다. 그리고 현재, Equals(Object) 메서드를 구현하지 않습니다. 그러나, ToString, Equals(Object), 및 GetHashCode 메소드를 나타냅니다. 이는 C# 또는 Visual Basic 코드에서 사용되고 이 메서드에 대한 기본 동작을 제공 하는 .NET Framework 메서드일 경우 입니다.

참고참고

C# 또는 Visual Basic 작성된 Windows 런타임 클래스는 Equals(Object) 메서드 오버로드를 재정의할 수 있습니다.

호출자를 위한 정보

파생 클래스에서 Object.Equals(Object) 메소드는 빈번하게 값 일치를 구현하기 위하여 재정의합니다. 게다가, 형식은 Equals 메소드에서 강하게 형식화된 추가적인 오버로드를 제공합니다, 말그대로 IEquatable<T> 인터페이스를 구현함으로써 입니다. Equals 메소드는 같은지 테스트 하는 방법을 호출할 때, 현재 인스턴스에서 재정의 하는지 여부를 알아야 할 Object.Equals 와 이해 하는 방법에 대 한 특정 호출에 Equals 메소드를 해결합니다. 그렇지 않으면 테스트를 의도한 것과 다르게 그리고 메서드에서 예기치 않은 값을 반환하는 일치를 수행할 수도 있습니다

다음 예제에서 이에 대해 설명합니다. 3개의 StringBuilder 개체를 동일한 문자열을 사용하여 4 번 호출 하면 Equals 메소드를 인스턴스화합니다. 첫 번째 메서드 호출은 true 를 반환하고, 나머지 세개를 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) 메서드 오버로드를 호출 합니다. 두 문자열을 할당 하기 때문에 StringBuilder 개체가 같은지, 메소드는 true를 반환합니다. 그러나, StringBuilderObject.Equals(Object)로 확대 변환되지 않습니다. 이 때문에, StringBuilder 개체에 캐스팅 되는 ObjectStringBuilder 인스턴스 형식의 변수에 할당 된 Object 일때, Object.Equals(Object, Object) 메서드는 두개의 StringBuilder 개체에 전달됩니다, 기본 Object.Equals(Object) 메서드는 호출됩니다. StringBuilder 은 참조 형식이기 때문에, 두개의 StringBuilder 개체를 지나가는 ReferenceEquals 메서드 일치입니다. 비록 세 가지 모든 StringBuilder 개체가 동일한 문자열을 포함하더라도, 세 개의 서로 다른 개체를 참조 합니다. 결과적으로, 이러한 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

대리자 형식이 같은 동일한 호출 목록으로 있어야 합니다.

interface

Object.Equals(Object)

참조 일치

값 형식에 대해, 항상 Equals을 재정의합니다. 왜냐하면 일치하는 테스트 리플렉션을 사용 하는 성능 저하를 제공 하기 때문입니다. 기본 구현인 Equals 을 재정의할 수도 있습니다. 참조 형식의 참조 일치 대신 값 일치 여부를 테스트하고 값 일치의 정확한 의미를 정의 합니다. 이러한 Equals 를 구현하면 두 개체의 인스턴스는 달라도 "값"이 동일하면 true 가 반환됩니다. 개체의 "값" 을 구성하는 내용은 식의 구현자에 의해 결정되지만 일반적으로 개체의 인스턴스 변수에 저장된 일부 또는 모든 데이터로 구성됩니다. 예를 들어 String 의 값은 해당 문자열의 문자를 기준으로 하기 때문에 Object.Equals(Object) 클래스의 String.Equals(Object) 메서드는 동일한 문자가 동일한 순서로 들어 있는 두 문자열 인스턴스에 대해 true 를 반환합니다.

다음 예제에서는 재정의할 수 있는 Object.Equals(Object) 값이 같은지 테스트 하는 방법입니다. Equals 메소드는 Person 클래스에 대하여 재정의합니다. Person 이 기본클래스 구현 일치를 적용했을 경우, 두개의 Person 개체는 단일 개체를 참조 하는 경우에 동일한 것입니다. 그러나 이 경우에에서 두개의 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> 인터페이스는 일치에 대한 강력한 형식의 테스트를 제공하기 위해 구현할 수 있습니다.

Equals(Object) 메서드의 구현에 대해 다음 문이 모두 true여야 합니다. 목록에서 x, yz 가 아닌 개체 참조를 나타냅니다. 이는 null이 아닙니다.

  • x.Equals(x)는 부동 소수점 형식이 포함된 경우를 제외하고,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를 반환합니다.

  • xy 가 참조하는 개체를 수정하지 않는 한 x.Equals(y) (y)를 계속 호출해도 같은 값이 반환됩니다.

  • x.Equals(null)false를 반환하는 경우

Equals 의 구현은 예외를 throw 해야 합니다; 항상 값을 반환 해야 합니다. 예를 들어, objnull 입니다, Equals 메서드는 falseArgumentNullException throw하는 대신에 반환해야 합니다.

Equals(Object) 를 재정의 하는 경우, 다음 지침을 따르십시오.

  • IComparable 을 구현하는 형식은 Equals(Object)를 재정의해야 합니다.

  • Equals(Object) 를 재정의하는 형식은 GetHashCode 를 재정의해야 합니다 ; 그렇지 않으면 해시 테이블이 제대로 작동하지 않을 수 있습니다.

  • 구현을 고려해 야는 IEquatable<T> 강력 하 게 지원 하기 위해 인터페이스 형식의 같은지 테스트 합니다. 여기서 IEquatable<T>.Equals 구현은 Equals을 포함하고 있는 결과를 반환해야 합니다.

  • 프로그래밍 언어에서 연산자 오버 로드와 지정된 형식에 대해 같은 연산자를 오버 로드하는 경우, 연산자와 동일한 결과 반환하기 위한 Equals(Object) 메서드를 재정의해야만 합니다. 이 지침을 따르면 응용 프로그램 코드에서 일치 연산자를 사용하는 것과 동일한 방식으로 클래스 라이브러리에서 Equals ( ArrayListHashtable) 메서드를 사용할 수 있습니다.

bsc2ak47.collapse_all(ko-kr,VS.110).gif참조 형식에 대한 지침

참조 형식에 대해서 Equals(Object) 를 재정의하기 위해 다음 지침을 적용합니다.

  • 특정 형식의 의미가 어떤 값을 나타내는 경우에는 참조 형식에 대해 Equals 메서드를 재정의할 수 있습니다.

  • 대부분의 참조 형식은 Equals 메서드를 오버로드할 수 있지만 일치 연산자를 오버로드해서는 안 됩니다. 그러나 복합 숫자 형식과 같이 값 의미를 갖는 참조 형식을 구현하는 경우에는 일치 연산자를 오버로드해야 합니다.

  • 변경가능한 참조형식인 Equals 를 재정의하지 않습니다. 여기서 Equals 를 재정의하는 것은, 이전 섹션에서 설명한 것 처럼, GetHashCode 메서드를 재정의하는 것을 필요로 합니다. 이는 수명주기 동안 가변 참조 형식 사례의 해시 코드는 변할 수 있다는 것을 의미합니다, 이것은 개체가 해시테이블에서 손실되는 것을 야기시킵니다.

bsc2ak47.collapse_all(ko-kr,VS.110).gif값 형식에 대한 지침

참조 형식에 대해서 Equals(Object) 를 재정의하기 위해 다음 지칰을 적용합니다.

  • 하나 이상의 필드를 포함 하는 값 형식을 정의 하는 경우, 해당 값은 Equals(Object) 참조 형식 재정의를 해야 합니다. ValueType 에 의해 제공된 Equals(Object) 구현은 형식에 대한 바이트 단위 비교를 실행합니다. 이는 필드가 모든 값 형식입니다, 그러나 값형식을 필드 단위로 비교하기 위해서는 리플렉션을 사용합니다, 이는 필드가 참조형식을 포함합니다.

  • Equals 를 재정의하는 경우와 개발 언어가 연산자 오버로딩을 지원하는 경우, 평균 연산자를 재정의해야 합니다.

  • IEquatable<T> 인터페이스를 구현해야만 합니다. 강력하게 형식화된 IEquatable<T>.Equals 메서드를 호출하는 것은 boxing을 방지할 수 있는 obj 인수입니다.

다음 예제에서는 Point 클래스를 보여줍니다. 이는 Equals 메소드를 값 평균을 제공하기 위해 재정의 하고, Point로부터 도출된 Point3D 클래스를 보여줍니다. 왜냐하면 PointObject.Equals(Object) 를 값이 같은지 테스트하기 위하여 재정의의 때문에, Object.Equals(Object) 메서드는 호출되지 않습니다. 그러나 Point3D.EqualsPoint.Equals 를 호출합니다. 왜냐하면 PointObject.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


Point.Equals 메소드는 obj 인수는 null 이 아닌 것을 확신하기 위해 확인합니다. 그리고 이 개체로서 동일한 형식의 사례를 참조합니다. 만일 둘다 실패로 확인된 경우, 메소드는 false를 반환합니다.

Point.Equals 메소드는 GetType 메소드를 두개체의 런타임 형식이 동일한 지 결정하기 위해 호출합니다. 메소드가 obj is Point 형식의 확인을 Visual Basic에서 C# 또는 TryCast(obj, Point) 에서 사용할 경우, 확인은 true 를 반환합니다. objPoint의 클래스로부터 도출된 사례일 경우이며, 비록 obj 와 현재 사례가 동일한 런타임 형식이 아닐 경우입니다. 다양화된 두 개체 모두를 갖는 것은 동일한 형식에서 존재하는 것입니다, 메소드는 objPoint 를 형식화 하기 위해 캐스트하고 두 개체의 필드 사례를 비교한 결과를 반환합니다.

Point3D.Equals 에서, 상속된 Object.Equals(Object) 를 재정의했던 Point.Equals 메소드는, 그 밖에 다른 무언가를 수행하기 전에 호출됩니다. 왜냐하면 Point3D 는 클래스를(NotInheritable Visual Basic에서)봉인하기 때문에, 체크인 obj is Point 형식은 C# 또는 TryCast(obj, Point) Visual Basic에서 objPoint3D 개체인 것을 확신하는 데 충분합니다. Point3D 개체인 경우, Point 개체 및 실행된 기본 클래스 구현인 Equals를 캐스트 합니다. 오직 상속된 Point.Equals 메소드는 true 를 반환할 경우, 메소드는 도출된 클래스에서 소개된 z 개체 필드를 비교합니다.

다음 예제는 Rectangle 클래스를 정의합니다. 이는 내부적으로 두개의 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


왜냐하면 Complex 는 값 형식이기 때문에, 도출될 수 없습니다. 그러므로 Equals(Object) 메소드에 오버라이드는 GetType 호출을 각 개체의 간결한 런타임 형식을 결정하기 위해 필요로 하지 않습니다, 그러나 C#에서 is 연산자 또는 Visual Basic에서 TypeOf 연산자를 obj 매개변수의 형식을 확인하기 위해 대신 사용할 수 있습니다.

.NET Framework

4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0에서 지원

.NET Framework Client Profile

4, 3.5 SP1에서 지원

이식 가능한 클래스 라이브러리

이식 가능한 클래스 라이브러리에서 지원

Windows 스토어 앱용 .NET

Windows 8에서 지원

Windows Phone 앱용 .NET

Windows Phone 8, Silverlight 8.1에서 지원

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(서버 코어 역할은 지원되지 않음), Windows Server 2008 R2(서버 코어 역할은 SP1 이상에서 지원, Itanium은 지원되지 않음)

.NET Framework에서 모든 플랫폼의 전체 버전을 지원하지는 않습니다. 지원되는 버전의 목록을 보려면 .NET Framework 시스템 요구 사항을 참조하십시오.

커뮤니티 추가 항목

추가
Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2014 Microsoft