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 =)的方法,需要调用专门的方法类实现深度复制。