CA1815:equals および operator equals を値型でオーバーライドしますCA1815: Override equals and operator equals on value types

TypeNameTypeName OverrideEqualsAndOperatorEqualsOnValueTypesOverrideEqualsAndOperatorEqualsOnValueTypes
CheckIdCheckId CA1815CA1815
CategoryCategory Microsoft.PerformanceMicrosoft.Performance
互換性に影響する変更点Breaking Change なしNon-breaking

原因Cause

値の型をオーバーライドしないSystem.Object.Equalsまたは等値演算子 (= =) を実装していません。A value type does not override System.Object.Equals or does not implement the equality operator (==). このルールは、列挙型をチェックしません。This rule does not check enumerations.

既定では、このルールのみが検索に、外部から参照の種類が、これは構成可能なします。By default, this rule only looks at externally visible types, but this is configurable.

規則の説明Rule description

値型、継承した実装のEqualsリフレクション ライブラリを使用して、すべてのフィールドの内容を比較します。For value types, the inherited implementation of Equals uses the Reflection library, and compares the contents of all fields. Reflection は計算コストが高いため、場合によってはすべてのフィールドで等値性を比較する必要はありません。Reflection is computationally expensive, and comparing every field for equality might be unnecessary. ユーザーは比較または並べ替えるのインスタンスまたはハッシュ テーブル キーとして使用する場合、値型を実装する必要がありますEqualsします。If you expect users to compare or sort instances, or use them as hash table keys, your value type should implement Equals. お使いのプログラミング言語が演算子のオーバーロードに対応している場合、等値演算子と非等値演算子も実装してください。If your programming language supports operator overloading, you should also provide an implementation of the equality and inequality operators.

違反の修正方法How to fix violations

この規則違反を修正するには、実装を提供Equalsします。To fix a violation of this rule, provide an implementation of Equals. 可能な場合は、等値演算子を実装します。If you can, implement the equality operator.

警告を抑制します。When to suppress warnings

値型のインスタンスを相互に比較しない場合は、この規則による警告を抑制するのには安全です。It is safe to suppress a warning from this rule if instances of the value type will not be compared to each other.

構成機能Configurability

この規則からを実行している場合FxCop アナライザー (および静的コード分析ではなく)、のどの部分を構成することができます、コードベースでこのルールを実行する、アクセシビリティに基づきます。If you're running this rule from FxCop analyzers (and not through static code analysis), you can configure which parts of your codebase to run this rule on, based on their accessibility. など、非パブリック API サーフェイスに対してのみ、ルールを実行するかを指定するには、プロジェクト内の .editorconfig ファイルに次のキー/値ペアを追加します。For example, to specify that the rule should run only against the non-public API surface, add the following key-value pair to an .editorconfig file in your project:

dotnet_code_quality.ca1815.api_surface = private, internal

このルールだけ、すべてのルール、またはすべてのルールは、このオプションは、このカテゴリ (パフォーマンス) で構成できます。You can configure this option for just this rule, for all rules, or for all rules in this category (Performance). 詳細については、次を参照してください。構成 FxCop アナライザーします。For more information, see Configure FxCop analyzers.

Example

次のコードは、この規則に違反する構造体 (値型) を示しています。The following code shows a structure (value type) that violates this rule:

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

次のコードは、オーバーライドすることで以前の違反を修正System.ValueType.Equalsと等値演算子の実装 (= =、! =)。The following code fixes the previous violation by overriding System.ValueType.Equals and implementing the equality operators (==, !=):

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

関連項目See also