CA1815 : Remplacez Equals et l'opérateur égal à dans les types valeur

TypeName

OverrideEqualsAndOperatorEqualsOnValueTypes

CheckId

CA1815

Catégorie

Microsoft.Performance

Modification avec rupture

Modification sans rupture

Cause

Un type valeur public ne se substitue pas à Object.Equals, ni n'implémente l'opérateur d'égalité (==). Cette règle ne vérifie aucune énumération.

Description de la règle

Pour les types valeur, l'implémentation héritée de Equals utilise la bibliothèque Reflection et compare le contenu de tous les champs. Le processus de réflexion sollicite fortement les ressources informatiques et la comparaison de chaque champ à la recherche d'une égalité peut s'avérer inutile. Si des utilisateurs sont susceptibles de comparer ou de trier des instances, ou de les utiliser en tant que clés de table de hachage, votre type valeur doit implémenter Equals. Si votre langage de programmation prend en charge la surcharge d'opérateur, vous devez également fournir une implémentation des opérateurs d'égalité et d'inégalité.

Comment corriger les violations

Pour résoudre une violation de cette règle, fournissez une implémentation d' Equals. Dans la mesure du possible, implémentez l'opérateur d'égalité.

Quand supprimer les avertissements

ll est possible de supprimer sans risque un avertissement de cette règle en l'absence de comparaison des instances du type valeur.

Exemple de violation

Description

L'exemple suivant indique une structure (type valeur) qui enfreint cette règle.

Code

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

Exemple de résolution

Description

L'exemple suivant résout la violation précédente en remplaçant ValueTypeEquals() et en implémentant les opérateurs d'égalité (==, !=).

Code

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

Règles connexes

CA2224 : Remplacez Equals au moment de surcharger l'opérateur égal

CA2231 : Surchargez l'opérateur égal (equals) en remplaçant ValueType.Equals

CA2226 : Les opérateurs doivent contenir des surcharges symétriques

Voir aussi

Référence

Object.Equals