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

来源:互联网 发布:中国远征军 知乎 编辑:程序博客网 时间:2024/06/05 00:54

本文参考这位大神的文章


在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的相等运算符判断是否为空,然后,在进行自己需要的判断


0 0
原创粉丝点击