相等运算符重载陷阱

本文详细分析了在C#中重载运算符时可能导致的死循环问题,并提供了修复方案。通过重写运算符方法,避免了循环调用,确保了程序的正常运行。

 

static void Main(string[] args)
{
Test t = new Test();
t.MyFun();
Console.ReadLine();

}

class Test
{
//自定义方法用来测试重载运算符
public void MyFun()
{
Test t = new Test();
if (t == null) Console.WriteLine("t为空!");
Console.WriteLine("t不为空!");
}
//重载相等运算符
public static bool operator ==(Test t1, Test t2)
{
return t2.Equals(t1);
}
//重载不等运算符
public static bool operator !=(Test t1, Test t2)
{
return !(t1==t2);
}
//重写HashCode方法
public override int GetHashCode()
{
return base.GetHashCode();
}
//重写Equals方法
public override bool Equals(object obj)
{
return base.Equals(obj);
}

}

分析:调试中发现t2为空。当程序判断引用变量t的值是否等于空时,就会使用相等运算符,进一步就会调用重载相等运算符所对应的方法,这样t和null就会作为该方法的参数被传入,而null恰好被传递给参数t2,而且重载方法也会调用本方法,死循环。

解决:

public static bool operator ==(Test t1, Test t2)
{
if ((t2 as object) == null)
{
return (t1 as object) == null;
}
else
{
return t2.Equals(t1);
}
}

转载于:https://www.cnblogs.com/vakeynb/p/vakey.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值