İngilizce dilinde oku

Aracılığıyla paylaş


CA1815: Değer türlerinde eşittir ve işleç eşitliklerinin üzerine yaz

TürAdı

OverloadOperatorEqualsOnOverridingValueTypeEquals

CheckId

CA1815

Kategori

Microsoft.Performance

Bozan Değişiklik

Bozmayan

Sebep

Ortak değer türü Object.Equals 'i geçersiz kılmaz veya eşitlik işleci (==)'ni uygulamaz.Bu kural, numaralandırmaları denetlemez.

Kural Tanımı

Değer türleri için, Equals 'in uygulama mirası, Reflection kitaplığını kullanır ve türündeki tüm alanların içeriğini karşılaştırır.Yansıma hesaplama açısından pahalıdır ve her alan için eşitlik karşılaştırma gereksiz olabilir.Kullanıcıları karşılaştırmak, örneklerini sıralamak veya tablo anahtarlarını karma olarak kullanılmalarını bekliyorsanız, değer türünüz Equals'i uygulamalıdır.Programlama diliniz operatörün aşırı yüklemesine destek sağlıyorsa, eşitlik ve eşitsizlik operatörleri için uygulama sağlamalısınız.

İhlallerin Düzeltilmesi

Bu kuralın ihlalini düzeltmek için, Equals 'un uygulamasını sağlamak.Mümkünse, eşitlik işlecinin uygulaması

Uyarılar Ne Zaman Bastırılmalı

Değer türünün örnekleri birbiri ile karşılaştırılamayacaksa, bu kuraldan bir uyarı bastırmak güvenlidir.

Bir ihlal Örneği

Tanımlama

Aşağıdaki örnek, bu kuralı ihlal eden bir yapıyı (değer türü) gösterir.

Kod

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

Düzeltme örneği

Tanımlama

Aşağıdaki örnek, ValueType.Equals 'i geçersiz kılarak ve eşitlik işlecini (==,! =) uygulayarak önceki ihlalini düzeltir.

Kod

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

İlgili Kurallar

CA2224: Eşittir işlecini aşırı yükleyerek eşittiri geçersiz kılın

CA2231: ValueType.Equals değerini geçersiz kılmada eşittir işlecini aşırı yükle

CA2226: İşleçler simetrik aşırı yüklemelere sahip olmalıdır

Ayrıca bkz.

Başvuru

Object.Equals