Sdílet prostřednictvím


CA1815: Přepište rovná se a operátor rovnosti na hodnotových typech

TypeName

OverrideEqualsAndOperatorEqualsOnValueTypes

CheckId

CA1815

Kategorie

Microsoft.Performance

Narušující změna

Nenarušující

Příčina

Typ veřejné hodnoty nepřepisuje Object.Equals nebo neobsahuje implementaci operátoru rovnosti (==).Toto pravidlo nekontroluje výčtové typy.

Popis pravidla

Pro hodnotové typy, zděděná implementace Equals používá knihovnu reflexe a porovnává obsah všech polí.Reflexe je výpočetně náročná a porovnání rovnosti všech polí může být zbytečné.Pokud bude od uživatelů očekáváno porovnávání nebo třídění instancí nebo jejich využití k vytvoření hash klíčů pro tabulky, měla by tato hodnota implementovat Equals.Pokud programovací jazyk podporuje přetížení operátoru, měla by být k dispozici také implementace operátorů rovnosti a nerovnosti.

Jak vyřešit porušení

K nápravě porušení tohoto pravidla implementujte Equals.Pokud je to možné, implementujte operátor rovnosti.

Kdy potlačit upozornění

Je bezpečné potlačit upozornění tohoto pravidla, pokud nebudou instance typu hodnoty navzájem porovnány.

Příklad porušení

Description

Následující příklad ukazuje strukturu (typ hodnoty), která toto pravidlo porušuje.

Kód

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

Příklad opravy

Description

Následující příklad řeší předchozí porušení předchozí přepsáním ValueType.Equals a implementováním operátorů porovnání rovnosti (==,! =).

Kód

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

Související pravidla

CA2224: Přepište Equals při přetížení operátoru rovnosti

CA2231: Přetižte operátor equals při přepsání ValueType.Equals

CA2226: Operátory by měly mít symetrické přetížení

Viz také

Referenční dokumentace

Object.Equals