다음을 통해 공유


CA1815: 값 형식에서 Equals 또는 같음 연산자를 재정의하십시오.

TypeName

OverrideEqualsAndOperatorEqualsOnValueTypes

CheckId

CA1815

범주

Microsoft.Performance

변경 수준

주요 변경 아님

원인

public 값 형식이 Object.Equals를 재정의하지 않거나 같음 연산자(==)를 구현하지 않습니다. 이 규칙은 열거형을 검사하지 않습니다.

규칙 설명

값 형식의 경우 Equals의 상속된 구현에서 Reflection 라이브러리를 사용하며 모든 필드의 내용을 비교합니다. Reflection에는 많은 계산이 요구되며 모든 필드의 일치 여부를 비교하는 것이 불필요할 수 있습니다. 사용자가 인스턴스를 비교 또는 정렬할 것으로 예측되거나 인스턴스를 해시 테이블 키로 사용할 것으로 예측되는 경우에는 값 형식에서 Equals를 구현해야 합니다. 프로그래밍 언어에서 연산자 오버로딩을 지원하는 경우 같음 연산자와 같지 않음 연산자의 구현도 제공해야 합니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 Equals의 구현을 제공합니다. 가능한 경우 같음 연산자를 구현합니다.

경고를 표시하지 않는 경우

값 형식의 인스턴스를 서로 비교하지 않는 경우에는 이 규칙에서 경고를 표시하지 않아도 안전합니다.

규칙 위반 예

설명

다음 예제에서는 이 규칙을 위반하는 구조체(값 형식)를 보여 줍니다.

코드

using System; 

namespace Samples
{    
    // Violates this rule    
    public struct Point    
    {        
        private readonly int _X;        
        private readonly int _Y;         

        public Point(int x, int y)        
        {            
            _X = x;            
            _Y = y;        
        }         

        public int X        
        {            
            get { return _X; }        
        }         

        public int Y        
        {            
            get { return _Y; }        
        }    
    }
}

수정 방법 예

설명

다음 예제에서는 ValueTypeEquals()를 재정의하고 같음 연산자(==, !=)를 구현하여 앞의 규칙 위반 문제를 해결합니다.

코드

using System; 

namespace Samples
{    
    public struct Point : IEquatable<Point>    
    {        
        private readonly int _X;        
        private readonly int _Y;         

        public Point(int x, int y)        
        {            
            _X = x;            
            _Y = y;        
        }         

        public int X        
        {            
            get { return _X; }        
        }         

        public int Y        
        {            
            get { return _Y; }        
        }         

        public override int GetHashCode()        
        {            
            return _X ^ _Y;        
        }         

        public override bool Equals(object obj)        
        {            
            if (!(obj is Point))                
                return false;             

            return Equals((Point)obj);        
        }         

        public bool Equals(Point other)        
        {            
            if (_X != other._X)                
                return false;             

            return _Y == other._Y;        
        }         

        public static bool operator ==(Point point1, Point point2)        
        {            
            return point1.Equals(point2);        
        }         

        public static bool operator !=(Point point1, Point point2)        
        {            
            return !point1.Equals(point2);        
        }    
    }
}

관련 규칙

CA2224: 같음 연산자를 오버로드할 때 Equals를 재정의하십시오.

CA2231: ValueType.Equals를 재정의할 때 같음 연산자를 오버로드하십시오.

CA2226: 연산자에는 대칭 오버로드가 있어야 합니다.

참고 항목

참조

Object.Equals