博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CLR via C#]5.4 对象哈希码和dynamic基元类型
阅读量:5091 次
发布时间:2019-06-13

本文共 1204 字,大约阅读时间需要 4 分钟。

  FCL的设计者认为,如果能将任何对象的任何实例放到一个哈希表集合中,会带来很多好处。为此,System.Object提供了虚方法GetHashCode,它能获取任意对象的Int32哈希值。

  如果你重写了Equals方法,那么还应重写GetHashCode方法。因为在System.Collection.Hashtable类型、System.Collections.Generic.Dictionary类型以及其他一些集合实现中,要求两个对象为了相等,必须具有相同的哈希码,所以重写了Equals,那么还应该重写GetHashCode,确保相等性算法和对象哈希码算法是一致的。
 
  System.ValueType实现的GetHashCode采用了反射机制(它的速度较慢),并对类型的实例字段执行的XOR运算。建议自己实现 GetHashCode,这样才能确切的掌握它所做的事,而且你的实现会比ValueType的实现快一些。
 
  在自己实现哈希表集合时,或调用GetHashCode,千万不要对哈希码进行持久化,因为哈希码很容易改变。

  为了方便开发人员使用发生或者与基本组件通信,C#编译器允许将一个表达式的类型标记为dynamic.还可将一个表达式的结果放在一个变量中,并将变量的类型标记为dynamic,然后,可以用这个dynamic表达式/变量调用一个成员,比如字段、属性/索引器、方法、委托等。

  代码使用dynamic表达式/变量调用一个成员时,编译器会生成特殊的IL代码来描述所需要的操作。这种特殊的代码称为payload(有效载荷)。在运行时,payload代码根据当前有dynamic表达式/变量引用的对象的实际类型来决定具体执行的操作。

   不要混淆dynamic和var。用var声明的局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型。var关键字只能用于声明方法内部的局部变量,而dynamic关键字可用于局部变量,字段和参数。表达式不能转型为var,但可以转型为dynamic。必须实现初始化化var声明的变量,但无需初始化用dynamic声明的变量。

  dynamic表达式其实与System.Object一样的类型。编译器假定你在表达式上进行任何操作都是合法的,所以不会生成任何警告和错误。但是试图在运行时执行无效操作,就会抛出异常。

  不能定义对dynamic进行扩展的扩展方法,但可以定义对Object进行扩展的扩展方法。

  不能讲Lambda表达式或者匿名方法作为实参传给dynamic方法调用,因为编译器不能推断出要使用的类型。

  C#内建的动态求值功能所产生的额外开销是不容忽视的。虽然能用动态功能简化语法,但也要看是否值得。

转载于:https://www.cnblogs.com/zxj159/p/3533182.html

你可能感兴趣的文章
黑马程序员——2 注释
查看>>
用OGRE1.74搭建游戏框架(三)--加入人物控制和场景
查看>>
转化课-计算机基础及上网过程
查看>>
android dialog使用自定义布局 设置窗体大小位置
查看>>
ionic2+ 基础
查看>>
互联网模式下我们更加应该“专注”
查看>>
myeclipse集成jdk、tomcat8、maven、svn
查看>>
查询消除重复行
查看>>
Win 10 文件浏览器无法打开
查看>>
[leetcode]Minimum Path Sum
查看>>
内存管理 浅析 内存管理/内存优化技巧
查看>>
【BZOJ 5222】[Lydsy2017省队十连测]怪题
查看>>
Java跟Javac,package与import
查看>>
day-12 python实现简单线性回归和多元线性回归算法
查看>>
Json格式的字符串转换为正常显示的日期格式
查看>>
[转]使用 Razor 进行递归操作
查看>>
[转]Android xxx is not translated in yyy, zzz 的解决方法
查看>>
docker入门
查看>>
Android系统--输入系统(十一)Reader线程_简单处理
查看>>
监督学习模型分类 生成模型vs判别模型 概率模型vs非概率模型 参数模型vs非参数模型...
查看>>