您的位置:首页 > 编程语言 > C#

关于C#相等运算符(==)重载的问题

2016-06-14 08:52 267 查看
本文参考这位大神的文章

在C#里面,都知道自定义的class是引用类型,是可以为null的,于是出现了以下问题:

遇到需求,需要对自定义class实例比较是否相等,开始 我的代码是这样(测试代码,没什么较大的实际意义)

class CTest
{
public int i;

static public bool operator==(CTest _1, CTest _2)
{
return _1.i == _2.i;
}

public static operator !=(CTest _1, CTest _2)
{
return !(_1 == _2);
}
}
但是当出现这样的代码时,就会出问题(在Unity中报空引用的错误):

CTest instance;

if(instance == null)
{
// ......
}else
{
// ......
}

经过调试发现,是因为instance为null,于是调用重载的相等运算符时产生了异常。一时之间想不到比较好的解决方法,后来在网上查到开头的文章,于是将代码改成这样,就成功了:
class CTest
{
public int i;

static public bool operator == (CTest _1, CTest _2)
{
// if (_1.Equals(_2))
// return true;

bool _1_null = (_1 as object) == null;
bool _2_null = (_2 as object) == null;

if (_1_null && _2_null)
return true;

if ((_1_null && !_2_null) || (_2_null && !_1_null))
return false;

return _1.i == _2.i;
}

static public bool operator !=(CTest _1, CTest _2)
{
return !(_1 == _2);
}
}

在进入相等运算符的函数时,首先判断参数是否为空,而该项判断也会调用相等运算符,所以暂时把参数转化为object,调用object的相等运算符判断是否为空,然后,在进行自己需要的判断
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class c# 重载运算符