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

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

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

public override bool Equals(object obj) 

if (obj == null) 

return false; 

RuntimeType type1 = (RuntimeType) base.GetType(); 
RuntimeType type2 = (RuntimeType) obj.GetType(); 
if (type2 != type1) 

return false; 

object obj1 = this; 
if (ValueType.CanCompareBits(this)) 

return ValueType.FastEqualsCheck(obj1, obj); 

FieldInfo[] infoArray1 = type1.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 
for (int num1 = 0; num1 < infoArray1.Length; num1++) 

object obj2 = ((RtFieldInfo) infoArray1[num1]).InternalGetValue(obj1, false); 
object obj3 = ((RtFieldInfo) infoArray1[num1]).InternalGetValue(obj, false); 
if (obj2 == null) 

if (obj3 != null) 

return false; 


else if (!obj2.Equals(obj3)) 

return false; 


return true; 

转载于:https://www.cnblogs.com/tansm/archive/2006/12/12/589569.html

结构类型需要重载GetHashCode和Equals相关推荐

  1. C#中将结构类型数据存储到二进制文件中方法

    以往在vb6,vc6中都有现成的方法将结构类型数据写入和读取到二进制文件中,但是在c#中却没有现成的方法来实现,因此我查阅了一些资料,借鉴了网上一些同学的做法,自己写了个类似的例子来读写结构类型数据到 ...

  2. Matlab中的结构类型struct

    结构(struct)数组 要在MALTAB中实现比较复杂的编程,就不能不用struct类型.而且在MATLAB中实现struct比C中更为方便. 4. 3.1 结构数组的创建 MATLAB提供了两种定 ...

  3. C# 类型运算符重载在类继承中的调用测试

    C# 类型运算符重载在类继承中的调用测试 这是一篇晦涩难懂的片面的研究 一,简单的继承层次 class CA {}class CB : CA{}class CC : CB{}}void Test(CA ...

  4. 不要伤害指针(3)--指针和结构类型的关系

    可以声明一个指向结构类型对象的指针. struct MyStruct {int a;int b;int c; }; struct MyStruct ss = {20,30,40};//声明了结构对象s ...

  5. DELPHI学习---结构类型

    Structured types (结构类型) 结构类型的一个实例可包含多个值.结构类型包括集合.数组.记录,也包括类.类引用(class-reference) 和接口类型.除了集合只能包含有序值以外 ...

  6. Linux 命令之 arch --显示主机的硬件结构类型

    文章目录 介绍 命令示例 介绍 arch命令主要用于显示当前主机的硬件结构类型,arch命令输出的结果有:i386.i486.mips.alpha等. 此命令的适用范围:RedHat.RHEL.Ubu ...

  7. [转载] 向集合中添加自定义类型--建议在自定义类型的时候要重写equals方法

    参考链接: Java重写equals方法 package com.bjpowernode.t01list; import java.util.ArrayList; /* * 向集合中添加自定义类型 * ...

  8. C#编程语言(六):枚举类型与结构类型

    枚举类型 枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法. 例如,假设您必须定义一个变量,该变量的值表示一周中的一天. 该变量只能存储七个有意义的值. 若要定义这些值, ...

  9. struct lnode是什么结构类型_【自考】数据结构第三章,队列,期末不挂科指南,第4篇

    队列 这篇博客主要介绍一下队列的概念,并且采用C语言,编写两种存储实现方式:顺序存储和链式存储,当然还有常规的队列基本操作的实现算法 队列基本概念 标准解释:队列(Queue)是有限个*同类型*数据元 ...

最新文章

  1. 避免35岁现象,我给技术人的建议永远是架构师!
  2. CodeOne 主题演讲:Java,未来已来
  3. 全面拥抱HDR时机已到?
  4. vue php 文件上传,使用vue.js和laravel上传文件
  5. ctf 改变图片高度_通过CRC32爆破修改图片的宽高 ctf-misc图片隐写
  6. HDU1407 测试你是否和LTC水平一样高【暴力】
  7. 如何生成CGCS2000坐标系等高线
  8. MATLAB 剔除异常点
  9. 调度器锁rt_enter_critical() rt_exit_critical()
  10. 河南大学计算机学院魏倩,何欣-计算机与信息工程学院官网
  11. 阿里云部署数据库(遇到的问题及解决方案)
  12. 你的电脑被黑客黑过吗?
  13. 数据库笔记——Mysql、Oracle、Sqlserver || Redis、Memcached、mongoDB环境搭建
  14. 谁来教我渗透测试——黑客必须掌握的Linux基础
  15. 关于linux android sdk配置环境
  16. 香农的“创意思维在编程的应用
  17. enicode字体反爬,大厂使用的反爬技术,结合OCR处理页面源代码
  18. android手机如何到导出电话号码,手机通讯录怎么导入到新手机?三种方法,快速迁移!...
  19. KM算法讲解(含C++代码)
  20. 表达式 625%2.5 是合法的c语言表达式,2008C程序设计期末试卷(A)

热门文章

  1. 对比学习:充分利用有限的医学标注数据 |NeurIPS 2020
  2. OpenPCDet:点云3D目标检测开源库
  3. CVPR 2020 Oral | 妙笔生花新境界,语义级别多模态图像生成
  4. 谷歌Auto-DeepLab:自动搜索图像语义分割架构算法开源实现
  5. 重磅!Uber发布史上最简单的深度学习框架Ludwig!不懂编程也能玩转人工智能
  6. 港中文开源 | 融合视频目标检测与单目标、多目标跟踪
  7. 太棒了!港大同济伯克利推出目标检测新范式:Sparse R-CNN
  8. 优秀!303篇论文获2020年度“优秀博士学位论文”!
  9. appbarlayout 折叠后 不允许滑动_还在纠结要不要建阳光房?看看可折叠阳光房,或许你就能做选择了...
  10. java 正则表达式 img_正则表达式处理图片地址、img标签的方法