Udostępnij za pośrednictwem


CA1815: Zastępowanie jest równe i operator jest równe na typy wartości

TypeName

OverrideEqualsAndOperatorEqualsOnValueTypes

CheckId

CA1815

Kategoria

Microsoft.Performance

Zmiana kluczowa

Niekluczowa

Przyczyna

Publiczny typ wartości nie zastępuje Object.Equals, lub nie implementuje operatora równości (==).Ta reguła nie sprawdza wyliczeń.

Opis reguły

Dla typów wartości, dziedziczony implementacja Equals używa biblioteki refleksji i porównuje zawartość wszystkich pól.Odbicie jest obliczeniowo kosztowne, a porównanie równości każdego pola może być niepotrzebne.Jeśli oczekuje się, że użytkownicy będą porównywać lub sortować wystąpienia lub używać ich jako kluczy tabeli mieszania, typ wartości powinien zaimplementować Equals.Jeśli język programowania obsługuje przeciążanie operatorów, należy również dostarczyć implementację operatorów równości i nierówności.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, dostarcz implementację Equals.Jeśli jest to możliwe, należy zaimplementować operator równości.

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli wystąpienia typu wartości nie będą porównywane ze sobą.

Przykład naruszenia

ms182276.collapse_all(pl-pl,VS.110).gifOpis

Poniższy przykład pokazuje strukturę (typ wartości) naruszający tę regułę.

ms182276.collapse_all(pl-pl,VS.110).gifKod

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; }        
        }    
    }
}

Przykład sposobu wprowadzenia poprawki

ms182276.collapse_all(pl-pl,VS.110).gifOpis

Poniższy przykład rozwiązuje poprzednie naruszenie zastępując ValueType.Equals i implementując operatory równości (==, !=).

ms182276.collapse_all(pl-pl,VS.110).gifKod

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);        
        }    
    }
}

Powiązane reguły

CA2224: Zastępowanie jest równe na przeciążanie operatora równości

CA2231: Operator przeciążenie jest równe na przesłanianie ValueType.Equals

CA2226: Podmioty gospodarcze powinny mieć overloads symetryczne

Zobacz też

Informacje

Object.Equals