前言
在编码中,为了提高代码的可读性,我们常常会去重载运算符以封装一些运算,良好的运算符重载,能够极大的提高代码的可读性。本文会讲==以及!=运算符重载。
重载函数
在C#中,重载的时候需要使用operator关键词来声明:
public static bool operator 运算符(object1 左对象, object 右对象){}
双目运算符在填写参数的时候需要输入两个参数,第一个参数为运算符的做参数,第二个为运算符的右参数,最后返回值为运算符的自定义结果。
这里讲重载运算符只讲==与!=,因为这两个运算符是成对出现,类似的还有<和>符号。
public struct TempStruct
{
public int x = 10;
public static bool operator ==(TempStruct a,TempStruct b)
{
if(a.x == b.x)
{
return true;
}
return false;
}
}
public static bool operator!=(TempStruct a,TempStruct b)
{
return !(a == b);//直接通过使用==的逻辑,避免写重复代码
}
这里在处理!=的时候,可以直接使用==的逻辑可以简化代码。同样的处理也可以放置在处理<和>的重载中。
之后我们在做两个结构体的比较的时候,就只需要使用如下代码,就能比较他们值得大小。
TempStruct a,b;
if(a == b){}
升级处理
你以为这样就完了?
对于==和!=的重载,如果输入为空的情况,那么上面的判断就会报错。那么最简答的修改,就是在函数中添加空判断:
public struct TempStruct
{
public int x = 10;
public static bool operator ==(TempStruct a,TempStruct b)
{
if(a == null)//会出现递归调用
{
if(b == null) return truel
return false;
}
if(a.x == b.x)
{
return true;
}
return false;
}
}
public static bool operator!=(TempStruct a,TempStruct b)
{
return !(a == b);//直接通过使用==的逻辑,避免写重复代码
}
这么写是很快,同时还考虑到了两个空对象的情况,但是这样会陷入死循环,因为在做空判断的时候出现了递归调用。
为了避免这种情况,对空的处理需要换一种方式:
public struct TempStruct
{
public int x = 10;
public static bool operator ==(TempStruct a,TempStruct b)
{
if(object.Equal(a,null) ||object.Equal(b,null) )//会出现递归调用
{
return object.Equal(a,b);
}
if(a.x == b.x)
{
return true;
}
return false;
}
}
public static bool operator!=(TempStruct a,TempStruct b)
{
return !(a == b);//直接通过使用==的逻辑,避免写重复代码
}
注意这里对空判断使用了object.Equal(a,b)方法,避免了对重载运算符的使用。