Aracılığıyla paylaş


CA1013: Eşittir işlecini ekleme ve çıkarmayı aşırı yükleyerek aşırı yükleyin

TypeName

OverloadOperatorEqualsOnOverloadingAddAndSubtract

CheckId

CA1013

Kategori

Microsoft.Tasarım

Bozan Değişiklik

Bozmayan

Sebep

Bir genel ya da korumalı tür eşitlik işlecini uygulamadan ekleme ya da çıkarma işleçlerini uygular.

Kural Tanımlaması

Bir türün örnekleri toplama ve çıkarma gibi işlemler kullanarak birleştirilebildiğinde, neredeyse her zaman aynı bileşen değerlerine sahip herhangi iki örnek için eşitliğin true döndürmesini tanımlamalısınız.

Yüklenmiş/tanımlanmış bir eşitlik operatörü uygulamasında varsayılan eşitlik operatörünü kullanamazsınız.Bunu yapmak bir yığın taşmasına neden olur.Eşitlik işlecini uygulamak için, uygulamanız içinde Object.Equals yöntemini kullanın.Aşağıdaki örneklere bakın.

If (Object.ReferenceEquals(left, Nothing)) Then
    Return Object.ReferenceEquals(right, Nothing)
Else
    Return left.Equals(right)
End If
if (Object.ReferenceEquals(left, null)) 
    return Object.ReferenceEquals(right, null);
return left.Equals(right);

İhlallerin Düzeltilmesi

Bu kuralın bir ihlalini düzeltmek için, eşitlik işlecini ekleme ve çıkarma işleçleriyle matematiksel olarak tutarlı olacak şekilde uygulayın.

Uyarılar Ne Zaman Bastırılmalı

Varsayılan eşitlik işleci tür için doğru davranışı sağladığı zaman bu kuraldan gelen bir uyarıyı gizlemek güvenlidir.

Örnek

Aşağıdaki örnek, bu kuralı ihlal eden bir türü (BadAddableType) tanımlar.Bu tür aynı alan değerlerine sahip olan herhangi iki örneğin eşitlik için true sınamasını yapmak için eşitlik işlecini uygulamalıdır.GoodAddableType türü düzeltilmiş uygulamayı gösterir.Bu türün ayrıca eşitsizlik işlecini uyguladığına ve diğer kuralları sağlamak için Equals geçersiz kıldığına da dikkat edin.Tam bir uygulama ayrıca GetHashCode da uygular.

using System;

namespace DesignLibrary
{
   public class BadAddableType
   {
      private int a, b;
      public BadAddableType(int a, int b)
      {
         this.a = a;
         this.b = b;
      }
      // Violates rule: OverrideOperatorEqualsOnOverridingAddAndSubtract. 
      public static BadAddableType operator +(BadAddableType a, BadAddableType b)
      {
         return new BadAddableType(a.a + b.a, a.b + b.b);
      }
      // Violates rule: OverrideOperatorEqualsOnOverridingAddAndSubtract. 
      public static BadAddableType operator -(BadAddableType a, BadAddableType b)
      {
         return new BadAddableType(a.a - b.a, a.b - b.b);
      }
      public override string ToString()
      {
         return String.Format("{{{0},{1}}}", a, b);
      }
   }

   public class GoodAddableType
   {
      private int a, b;
      public GoodAddableType(int a, int b)
      {
         this.a = a;
         this.b = b;
      }
      // Satisfies rule: OverrideOperatorEqualsOnOverridingAddAndSubtract. 
      public static bool operator ==(GoodAddableType a, GoodAddableType b)
      {
         return (a.a == b.a && a.b == b.b);
      }

      // If you implement ==, you must implement !=. 
      public static bool operator !=(GoodAddableType a, GoodAddableType b)
      {
         return !(a==b);
      }

      // Equals should be consistent with operator ==. 
      public override bool Equals(Object obj)
      {
         GoodAddableType good = obj as GoodAddableType;
         if (obj == null)
            return false;

        return this == good;
      }

      public static GoodAddableType operator +(GoodAddableType a, GoodAddableType b)
      {
         return new GoodAddableType(a.a + b.a, a.b + b.b);
      }

      public static GoodAddableType operator -(GoodAddableType a, GoodAddableType b)
      {
         return new GoodAddableType(a.a - b.a, a.b - b.b);
      }
      public override string ToString()
      {
         return String.Format("{{{0},{1}}}", a, b);
      }
   }
}

Aşağıdaki örnek eşitlik işlecinin varsayılan ve doğru davranışını göstermek için bu konuda daha önce tanımlanan türlerin örneklerini kullanarak eşitlik için sınar.

using System;

namespace DesignLibrary
{
    public class TestAddableTypes
    {
       public static void Main()
       {
          BadAddableType a = new BadAddableType(2,2);
          BadAddableType b = new BadAddableType(2,2);
          BadAddableType x = new BadAddableType(9,9);
          GoodAddableType c = new GoodAddableType(3,3);
          GoodAddableType d = new GoodAddableType(3,3);
          GoodAddableType y = new GoodAddableType(9,9);

          Console.WriteLine("Bad type:  {0} {1} are equal? {2}", a,b, a.Equals(b)? "Yes":"No");
          Console.WriteLine("Good type: {0} {1} are equal? {2}", c,d, c.Equals(d)? "Yes":"No");
          Console.WriteLine("Good type: {0} {1} are == ?   {2}", c,d, c==d? "Yes":"No");
          Console.WriteLine("Bad type:  {0} {1} are equal? {2}", a,x, a.Equals(x)? "Yes":"No");
          Console.WriteLine("Good type: {0} {1} are == ?   {2}", c,y, c==y? "Yes":"No");
       }
    }
}

Bu örnek aşağıdaki çıktıyı üretir.

           

Ayrıca bkz.

Diğer Kaynaklar

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