共用方式為


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

更新:2007 年 11 月

型別名稱

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

這個範例產生下列輸出。

a = new (2,2) and b = new (2,2) are equal? No
c and a are equal? Yes
b and a are == ? No
c and a are == ? Yes

相關規則

請多載加號和減號時覆寫運算子等號

請參閱

參考

實作 Equals 和相等運算子 (==) 的方針

Object.Equals