■■■重载==操作符的问题
我先在编写一个类时需要重载==操作符以判断类的成员数据是否相等,但遇到了一个诡异的问题:
当我在进行成员数据的判断之前,先需要判断该实例是否为null(因为如果为null,则会产生异常),而要判断该实例是否为null,又需要调用==操作符,这样就形成了无限递归而导致堆栈溢出异常。
请问大家是如何处理这个问题的?
代码如下:
public static bool operator ==(Hex h1,Hex h2)
{
if (h1 == null || h2 == null) //此处导致无限递归而堆栈溢出
return false;
if (h1.getBytesCount() != h2.getBytesCount()) //如果不判断对象为null,此处就会产生异常
return false;
byte[] b1 = h1.getBytes();
byte[] b2 = h2.getBytes();
for (int i = 0; i < b1.Length; i++)
{
if (b1[i] != b2[i])
return false;
}
return true;
}
------解决方案--------------------不要在引用类型中重载==运算符!
参考《Effective C#》原则9 Understand the Relationships Among ReferenceEquals(), static Equals(), instance Equals(), and operator==
http://www.cnblogs.com/WuCountry/archive/2007/02/25/656433.html
------解决方案--------------------可以用ReferenceEquals来判断。
另外同意ls的,C#里不要重载==,用Equals方法。