請勿多載參考型別上的等號比較運算子
更新: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