结构类型需要重载GetHashCode和Equals

我比较迟钝,到现在才知道结构类型放在字典作为键时,效率是不好的,最好重载GetHashCode和Equals,那效率究竟差异有多大呢?我写了一个测试程序。

 

None.gif ResourceServiceKey2 key1  =   new  ResourceServiceKey2( typeof (IRegisterAssemblyService), " OrderSheet " ); 
None.gif           ResourceServiceKey2 key2 
=   new  ResourceServiceKey2( typeof (IRegisterAssemblyService),  " OrderSheet " ); 
None.gif           DateTime begin 
=  DateTime.Now;
None.gif           DateTime endTime;           
bool  r;
ExpandedBlockStart.gifContractedBlock.gif           
for  ( int  i  =   0 ; i  <   10000000 ; i ++ dot.gif {               r = key1.Equals(key2);
ExpandedBlockEnd.gif           }
           endTime  =  DateTime.Now;
None.gif           TimeSpan s 
=  begin  -  endTime;
None.gif           ResourceServiceKey key3 
=   new  ResourceServiceKey( typeof (IRegisterAssemblyService),  " OrderSheet " );
None.gif           ResourceServiceKey key4 
=   new  ResourceServiceKey( typeof (IRegisterAssemblyService),  " OrderSheet " );
None.gif           begin 
=  DateTime.Now;
ExpandedBlockStart.gifContractedBlock.gif           
for  ( int  i  =   0 ; i  <   10000000 ; i ++ dot.gif {               r = key3.Equals(key4);
ExpandedBlockEnd.gif           }

None.gif           endTime 
=  DateTime.Now; 
None.gif          TimeSpan s2 
=  begin  -  endTime; 


ResourceServiceKey是重载了这两个方法的,共花了0.5秒左右,而ResourceServiceKey2没有重载,共花了22秒,差异还是挺大的。反编译ValueType(结构的基础类型),看了代码,才发现,这样不慢才怪呢。

None.gif public   override   bool  Equals( object  obj) 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
InBlock.gif
if (obj == null
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif
InBlock.gif
return false
ExpandedSubBlockEnd.gif}
 
InBlock.gifRuntimeType type1 
= (RuntimeType) base.GetType(); 
InBlock.gifRuntimeType type2 
= (RuntimeType) obj.GetType(); 
InBlock.gif
if (type2 != type1) 
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif
InBlock.gif
return false
ExpandedSubBlockEnd.gif}
 
InBlock.gif
object obj1 = this
InBlock.gif
if (ValueType.CanCompareBits(this)) 
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif
InBlock.gif
return ValueType.FastEqualsCheck(obj1, obj); 
ExpandedSubBlockEnd.gif}
 
InBlock.gifFieldInfo[] infoArray1 
= type1.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 
InBlock.gif
for (int num1 = 0; num1 < infoArray1.Length; num1++
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif
InBlock.gif
object obj2 = ((RtFieldInfo) infoArray1[num1]).InternalGetValue(obj1, false); 
InBlock.gif
object obj3 = ((RtFieldInfo) infoArray1[num1]).InternalGetValue(obj, false); 
InBlock.gif
if (obj2 == null
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif
InBlock.gif
if (obj3 != null
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif
InBlock.gif
return false
ExpandedSubBlockEnd.gif}
 
ExpandedSubBlockEnd.gif}
 
InBlock.gif
else if (!obj2.Equals(obj3)) 
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif
InBlock.gif
return false
ExpandedSubBlockEnd.gif}
 
ExpandedSubBlockEnd.gif}
 
InBlock.gif
return true
ExpandedBlockEnd.gif}
 
None.gif

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值