■■■重载==操作符的问题

goomoo 2007-03-28 11:22:14
我先在编写一个类时需要重载==操作符以判断类的成员数据是否相等,但遇到了一个诡异的问题:

当我在进行成员数据的判断之前,先需要判断该实例是否为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;
}
...全文
190 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
danjiewu 2007-03-28
  • 打赏
  • 举报
回复
可以用ReferenceEquals来判断。
另外同意ls的,C#里不要重载==,用Equals方法。
happyhippy 2007-03-28
  • 打赏
  • 举报
回复
不要在引用类型中重载==运算符!
参考《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
dalianu 2007-03-28
  • 打赏
  • 举报
回复
你的解决办法是什么?
把==改成!=?
dalianu 2007-03-28
  • 打赏
  • 举报
回复
二楼写的东西,看的晕了半天。
三楼的说法是不对的,因为==操作符就是调用了Equals方法的(System.Object 但System.String的Equlas方法不同,它重载了Object的Equlas方法,不用去判断2对象的地址是否相同,而使用EqualsHelper方法),而Object.Equals里调用的是InternalEquals方法,用来查看查看内存地址是否相同。所以,==操作符是可以重载的(但同时也是有风险的)。
不过最后,我还是帮不了你如何去重载==方法。。。。。
goomoo 2007-03-28
  • 打赏
  • 举报
回复
谢谢各位,我已经知道解决办法了。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧