public class MyClass
{
public int ID;
/*public static bool operator ==(MyClass c1, MyClass c2)
{
//下面这段代码中的“==”调用会进入递归,直至崩溃
if (c1 == null || c2 == null)
{
return c1 == c2;
}
return c1.ID == c2.ID;
}
public static bool operator !=(MyClass c1, MyClass c2)
{
//下面这段代码中的“==”调用会进入递归,直至崩溃
if (c1 == null || c2 == null)
{
return c1 != c2;
}
return c1.ID != c2.ID;
}*/
//正确的方法
public static bool operator ==(MyClass c1, MyClass c2)
{
//将c1对象转为object再进行判断
//这里的object.Equals(c1, null)也可以写成
//c1 as object == null
if (object.Equals(c1, null) || object.Equals(c2, null))
{
return object.Equals(c1, c2);
}
return c1.ID == c2.ID;
}
public static bool operator !=(MyClass c1, MyClass c2)
{
if (object.Equals(c1, null) || object.Equals(c2, null))
{
return !object.Equals(c1, c2);
}
return c1.ID != c2.ID;
}
}
参考: http://www.cnblogs.com/cruisoring/archive/2009/11/04/1595958.html
本文介绍了一种在C#中正确实现自定义类型的等于运算符(==)和不等于运算符(!=)的方法,避免了因直接使用递归调用而导致的无限循环问题,并提供了一个基于对象ID的安全实现方案。
571

被折叠的 条评论
为什么被折叠?



