다음을 통해 공유


참조 형식에 같음 연산자를 오버로드하지 마십시오.

업데이트: 2007년 11월

TypeName

DoNotOverloadOperatorEqualsOnReferenceTypes

CheckId

CA1046

범주

Microsoft.Design

변경 수준

주요 변경

원인

public 또는 중첩 public 참조 형식이 같음 연산자를 오버로드합니다.

규칙 설명

참조 형식의 경우 같음 연산자의 기본 구현은 대부분 항상 올바릅니다. 기본적으로 두 참조는 같은 개체를 가리킬 경우에만 같습니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 같음 연산자의 구현을 제거합니다.

경고를 표시하지 않는 경우

참조 형식이 기본 제공 값 형식과 비슷하게 동작할 경우에는 이 규칙에서 경고를 표시하지 않아도 안전합니다. 형식 인스턴스에 대해 더하기 또는 빼기가 의미 있을 경우 같음 연산자를 구현하고 위반을 표시하지 않는 것이 올바를 수 있습니다.

예제

다음 예제에서는 두 참조를 비교할 때의 기본 동작을 보여 줍니다.

using System;

namespace DesignLibrary
{
   public class MyReferenceType
   {
      private int a, b;
      public MyReferenceType (int a, int b)
      {
         this.a = a;
         this.b = b;
      }

      public override string ToString()
      {
         return String.Format("({0},{1})", a, b);
      }
   }
}

다음 응용 프로그램에서는 몇 가지 참조를 비교합니다.

using System;

namespace DesignLibrary
{
    public class ReferenceTypeEquality
    {
       public static void Main()
       {
          MyReferenceType a = new MyReferenceType(2,2);
          MyReferenceType b = new MyReferenceType(2,2);
          MyReferenceType c = a;

          Console.WriteLine("a = new {0} and b = new {1} are equal? {2}", a,b, a.Equals(b)? "Yes":"No");
          Console.WriteLine("c and a are equal? {0}", c.Equals(a)? "Yes":"No");
          Console.WriteLine("b and a are == ? {0}", b == a ? "Yes":"No");
          Console.WriteLine("c and a are == ? {0}", c == a ? "Yes":"No");     
       }
    }
}

이 예제의 결과는 다음과 같습니다.

a = new (2,2) and b = new (2,2) are equal? No
c and a are equal? Yes
b and a are == ? No
c and a are == ? Yes

관련 규칙

더하기 및 빼기를 오버로드할 때 같음 연산자를 오버로드하십시오.

참고 항목

참조

같음 및 같음 연산자(==) 구현 지침

Object.Equals