关于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的相等运算符判断是否为空,然后,在进行自己需要的判断
在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的相等运算符判断是否为空,然后,在进行自己需要的判断
相关文章推荐
- Android Native 绘图方法
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析