高手一看即知我要说什么,呵呵,请多批评

假设一自定义类名TemplateEntity,来重载它的==和!=,C#语法规定如果重载了==则必须重载!=,反之亦然

那,这个好实现,反正实体成员都是系统类型,可以直接使用其==或!=符号实现,想来不难~go~,分分种搞定的东东~

代码如下:

;
        }

 

呵呵,问题出来了,一运行,报栈溢出~
跟踪代码后发现不能在该方法内再次调用==和!=(PS:我们正在实现它,此时调用产生递归调用),这好办,不让使用==与null比较就使用Equals呗!
改为e1.Equals(e2),运行,报错~未将对象引用设置到实例~呵呵,原因是e1不能为null,那也不难呀,再判断下e1不为null就行了呗~
写上if( e1.Equals( null ) ) { return false; } ,null==null也要返回true的,问题又来了,什么问题嗫?
就是e1,e2同时为null的时候,无法比较了!因为调用null.Equals会报未将对象设置引用到实例的错误~又转回去了!
再后来发生的事情略过,越写越乱,一怒之下弃之~

最后参考MSDN代码实现如下
 a.Cont ent == b.Content
                
&& a.Description == b.Description
                
&& a.Extension == b.Extension
                
&& a.Include == b.Include
                
&& a.IsOnce == b.IsOnce
                
&& a.Name == b.Name
                
//&& a.ID == b.ID
                && a.Path == b.Path;
        }
上述代码是可以正常运行的,
写完==后马上着手写!=的实现,
代码如下
 b.Path;
        }

呵呵,大家是不是都看出来了,实现了==后,调用!=直接取反就可以了,所以可以简写如下
  <summary>
        
/// 重载运算符!=
        
/// </summary>
        
/// <param name="t1">TemplateEntity实例1</param>
        
/// <param name="t2">TemplateEntity实例2</param>
        
/// <returns></returns>
        public static bool operator !=( TemplateEntity a, TemplateEntity b ) {
            
return !( a == b );
        }
乱七八糟的写了一通,希望大家不会看晕,实在组织不好伦次了,就这么着吧~总结下~
有些问题在动手时才会发现,就像重载操作符一样,
脑子里一闪过而的想法就是:不难实现!
判断类型是否相等,判断成员是否相等,结合返回比较结果即可,
其实还应该考虑值相等,引用相等,类型相等等等问题,引用相等的情况下一定是值相等,值相等的情况下不一定是引用相等,这些都比较简单,贴上MSDN地址,感兴趣的朋友自己看看吧,
继续
说完了吗?不.大家一定看到方法中的最后一行了,比较各个成员值是否相同,也是我重载操作符的初衷,然而,写完上面的代码之后,我才发现,
其实第一印象是正确的!那就是应该继承IComparable接口,或者重写Equals方法,这才是值比较!而==多数情况下是引用比较~
那好了,就当写作业了~希望大家能把文章看完,不要被我举的错误的例子误导~因为我就经常把老师举的错误的例子记住,反而把正确的做法认为是不安全的,不可靠的从而导致做错,呵呵,在此提个醒~

相关文章:

  • 2022-12-23
  • 2021-09-28
  • 2021-11-17
  • 2021-10-07
  • 2022-01-09
  • 2021-07-12
  • 2021-07-22
猜你喜欢
  • 2021-05-31
  • 2021-06-12
  • 2022-12-23
  • 2021-05-07
  • 2021-12-02
  • 2022-01-19
  • 2022-12-23
相关资源
相似解决方案