我先在编写一个类时需要重载==操作符以判断类的成员数据是否相等,但遇到了一个诡异的问题:当我在进行成员数据的判断之前,先需要判断该实例是否为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;
}
{
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;
}
解决方案 »
- 采用设计模式究竟有什么好处?
- WinForm中如何判断Ctrl键是否被按下。
- 这样的hashtable该如何遍历
- 称重,谁没称过,可是未必你会知道怎么做?
- c# 中datagridview 显示table问题!苦恼中
- 高分求SQL问题,关于汇总数据(300分)
- 计算城市间的最短距离 求助~
- 求达人帮我把C#转换成VB.NET,不胜感激!在线转换报错。
- 如何在文本框中显示日文?
- 在c#中怎样弹出WIN2000的对话框:“输入网络密码”?急急,请各位大侠帮忙,先谢谢了
- cs文件代码注释都是用繁体,但是在简体操作系统里cs有些正常,有些变成了乱码,请问如何解决?
- GDI+如何实现一张纸牌从背面翻转到正面?
参考《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
另外同意ls的,C#里不要重载==,用Equals方法。
三楼的说法是不对的,因为==操作符就是调用了Equals方法的(System.Object 但System.String的Equlas方法不同,它重载了Object的Equlas方法,不用去判断2对象的地址是否相同,而使用EqualsHelper方法),而Object.Equals里调用的是InternalEquals方法,用来查看查看内存地址是否相同。所以,==操作符是可以重载的(但同时也是有风险的)。
不过最后,我还是帮不了你如何去重载==方法。。