Aracılığıyla paylaş


CA1036: Karşılaştırılabilir türlerde geçersiz kılma yöntemleri

TürAdı

OverrideMethodsOnComparableTypes

CheckId

CA1036

Kategori

Microsoft.Design

Bozan Değişiklik

Bozmayan

Sebep

Ortak veya korumalı türünü uygulayan IComparable arabirim ve geçersiz kılma yok ayarları Object.Equals ya da eşitlik, eşitsizlik, küçük veya büyük için dile özgü işleç aşırı değil.Yalnızca arabirim uygulaması türü devralır, kural ihlali bildirmez.

Kural Tanımı

Özel sıralama düzeni tanımlama türleri uygulayan IComparable arabirimi.CompareTo Yöntemi, iki tür örneği doğru sıralama düzenini gösteren bir tamsayı değerine döndürür.Bu kural, bir sıralama düzeni türlerini tanımlar; Bu eşitlik, eşitsizlik, sıradan anlamını az ve büyüktür değil uygulanacağını belirtir.Bu uygulamayı IComparable, sağladığınız zaman genellikle yeniden yazmanız gerekir Equals böylece tutarlı olan değerleri buna uyumlu CompareTo döndürür.Eğer Equals geçersiz kıldıysanız ve kodlamakta olduğunuz işlecin destekleyen bir dil ile tutarlı olan operatörler de sağlamalıdır Equals.

İhlallerin Düzeltilmesi

Bu kuralın ihlalini düzeltmek için Equals geçersiz kılın.Eğer proglama diliniz aşırı yüklenmiş işlemciyi destekliyorsa, aşağıdaki işleçleri sağlayın:

  • op_Equality

  • op_Inequality

  • op_LessThan

  • op_GreaterThan

C# [NULL]'da bu operatörleri temsil etmek için kullanılan simgeleri şunlardır: ==,! =, <, ve >.

Uyarılar Ne Zaman Bastırılmalı

Eksik operatörler olduğunda ve Visual Basic.NET'teki gibi programlama diliniz operatör aşırı yüklemesini desteklemediği zamanlarda bu kuralı bastırmak güvenlidir.Bu kural, op_Equality dışındaki eşitlik operatörleri tetiklendiğinde eğer uygulama bağlamında o operatörler anlamlı olmadığını belirlediyseniz bu kuralı bastırmak güvenlidir.Ancak, her zaman op_Equality ve == operatörünü üzerinde Object.Equals'ı geçersiz kılar.

Örnek

Aşağıdaki örnek IComparable uygulamasının doğru bir örneğini içerir.Equals ve IComparable arabirimiyle ilgili çeşitli kuralları karşılayan yöntemleri kod açıklamaları tanımlar.

using System;
using System.Globalization;

namespace DesignLibrary
{
    // Valid ratings are between A and C. 
    // A is the highest rating; it is greater than any other valid rating. 
    // C is the lowest rating; it is less than any other valid rating. 

    public class RatingInformation : IComparable, IComparable<RatingInformation>
    {
        public string Rating
        {
            get;
            private set;
        }

        public RatingInformation(string rating)
        {
            if (rating == null)
            {
                throw new ArgumentNullException("rating");
            }
            string v = rating.ToUpper(CultureInfo.InvariantCulture);
            if (v.Length != 1 || string.Compare(v, "C", StringComparison.Ordinal) > 0 || string.Compare(v, "A", StringComparison.Ordinal) < 0)
            {
                throw new ArgumentException("Invalid rating value was specified.", "rating");
            }
            this.Rating = v;
        }

        public int CompareTo(object obj)
        {
            if (obj == null)
            {
                return 1;
            }
            RatingInformation other = obj as RatingInformation; // avoid double casting 
            if (other == null)
            {
                throw new ArgumentException("A RatingInformation object is required for comparison.", "obj");
            }
            return this.CompareTo(other);
        }

        public int CompareTo(RatingInformation other)
        {
            if (object.ReferenceEquals(other, null))
            {
                return 1;
            }
            // Ratings compare opposite to normal string order,  
            // so reverse the value returned by String.CompareTo. 
            return -string.Compare(this.Rating, other.Rating, StringComparison.OrdinalIgnoreCase);
        }

        public static int Compare(RatingInformation left, RatingInformation right)
        {
            if (object.ReferenceEquals(left, right))
            {
                return 0;
            }
            if (object.ReferenceEquals(left, null))
            {
                return -1;
            }
            return left.CompareTo(right);
        }

        // Omitting Equals violates rule: OverrideMethodsOnComparableTypes. 
        public override bool Equals(object obj)
        {
            RatingInformation other = obj as RatingInformation; //avoid double casting 
            if (object.ReferenceEquals(other, null))
            {
                return false;
            }
            return this.CompareTo(other) == 0;
        }

        // Omitting getHashCode violates rule: OverrideGetHashCodeOnOverridingEquals. 
        public override int GetHashCode()
        {
            char[] c = this.Rating.ToCharArray();
            return (int)c[0];
        }

        // Omitting any of the following operator overloads  
        // violates rule: OverrideMethodsOnComparableTypes. 
        public static bool operator ==(RatingInformation left, RatingInformation right)
        {
            if (object.ReferenceEquals(left, null))
            {
                return object.ReferenceEquals(right, null);
            }
            return left.Equals(right);
        }
        public static bool operator !=(RatingInformation left, RatingInformation right)
        {
            return !(left == right);
        }
        public static bool operator <(RatingInformation left, RatingInformation right)
        {
            return (Compare(left, right) < 0);
        }
        public static bool operator >(RatingInformation left, RatingInformation right)
        {
            return (Compare(left, right) > 0);
        }
    }
}

Aşağıdaki uygulama IComparable uygulamasının erken gösterildiği bir test davranışıdır.

using System;

namespace DesignLibrary
{
    public class Test
    {
       public static void Main(string [] args)
       {
          if (args.Length < 2)
          {
             Console.WriteLine ("usage - TestRatings  string 1 string2");
             return;
          }
          RatingInformation r1 = new RatingInformation(args[0]) ;
          RatingInformation r2 = new RatingInformation( args[1]);
          string answer;

          if (r1.CompareTo(r2) > 0)
             answer = "greater than";
          else if (r1.CompareTo(r2) < 0)
             answer = "less than";
          else
             answer = "equal to";

          Console.WriteLine("{0} is {1} {2}", r1.Rating, answer, r2.Rating);      
       }
    }
}

Ayrıca bkz.

Başvuru

IComparable

Object.Equals

Diğer Kaynaklar

Guidelines for Implementing Equals and the Equality Operator (==)