C#語言中,由於內存爲系統自動管理,且重載Equals方法形參爲Object基類,加上C#建議實現GetHashCode方法來加快判斷,這樣在判斷相等方面就多了幾步:
1. 判斷兩個對象是否對象相等;
2. 判斷兩個對象類型是否相等;
3. 判斷兩個對象GetHashCode方法是否相等;
4. 判斷基類對象是否相等;
5. 判斷類成員是否相等;
這樣一個完整的方法實現如下:
class A {
public int val { set; get; }
public A(int value) {
val = value;
}
public override bool Equals(object obj)
{
if (obj == null) return false;
if (this.GetType() != obj.GetType())
return false;
A o = (A)obj;
if (ReferenceEquals(this, o))
return true;
if (this.GetHashCode() != o.GetHashCode())
return false;
if (base.GetType() != typeof(object) && !base.Equals(obj))
return false;
return this.val == o.val;
}
public override int GetHashCode()
{
return this.val ^ (this.val >> 32);
}
public override string ToString()
{
return String.Format("class a:{0}",val);
}
public static bool operator ==(A left, A right)
{
if (ReferenceEquals(left, null))
return ReferenceEquals(right, null);
return left.Equals(right);
}
public static bool operator !=(A left, A right)
{
return !(left == right);
}
};
class Program
{
static void Main(string[] args)
{
A a = new A(1);
A b = new A(2);
A c = a;
c.val = 3;
Console.WriteLine("a == b:{0},{1},a:{2}",a.Equals(b),a==b,a);
Console.ReadKey();
}
}
上面程序運行如下:
a ==b:False,a:class a:3
可以看出C#中對象賦值爲引用賦值,C#也不支持賦值操作符(operator =)的方法,需要調用專門的方法類實現深度複製。