共用方式為


CA1046:請勿多載參考型別上的等號比較運算子

型別名稱

DoNotOverloadOperatorEqualsOnReferenceTypes

CheckId

CA1046

分類

Microsoft.Design

中斷變更

中斷

原因

public 參考型別或巢狀的 Public 參考型別會多載等號比較運算子。

規則描述

對參考型別而言,等號比較運算子的預設實作 (Implementation) 永遠都是正確的。 根據預設,只有當兩項參考都指向相同物件時才會相等。

如何修正違規

若要修正此規則的違規情形,請移除等號比較運算子的實作。

隱藏警告的時機

如果參考型別的作用如同內建實值型別 (Value Type),則您可以放心地隱藏這項規則的警告。 如果在該型別的執行個體 (Instance) 上進行加法或減法是有意義的,則實作等號比較運算子並隱藏違規可能是正確做法。

範例

以下為比較兩個參考時之預設行為的範例。

using System;

namespace DesignLibrary
{
   public class MyReferenceType
   {
      private int a, b;
      public MyReferenceType (int a, int b)
      {
         this.a = a;
         this.b = b;
      }

      public override string ToString()
      {
         return String.Format("({0},{1})", a, b);
      }
   }
}

下列應用程式會比較某些參考。

using System;

namespace DesignLibrary
{
    public class ReferenceTypeEquality
    {
       public static void Main()
       {
          MyReferenceType a = new MyReferenceType(2,2);
          MyReferenceType b = new MyReferenceType(2,2);
          MyReferenceType c = a;

          Console.WriteLine("a = new {0} and b = new {1} are equal? {2}", a,b, a.Equals(b)? "Yes":"No");
          Console.WriteLine("c and a are equal? {0}", c.Equals(a)? "Yes":"No");
          Console.WriteLine("b and a are == ? {0}", b == a ? "Yes":"No");
          Console.WriteLine("c and a are == ? {0}", c == a ? "Yes":"No");     
       }
    }
}

這個範例產生下列輸出。

  
  
  
  
  

相關規則

CA1013:多載加號和減號運算子時必須一併多載等號比較運算子

請參閱

參考

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

Object.Equals