IEquatable「T」和Equal详解

Object.Equal()
  • Object本身有一个方法ReferenceEquals是比较引用是否相等的
  • 一般使用a.Equal(b)的时候,内部调用的是ReferenceEquals
  • Object的Equal()方法是虚方法
  • 对于Struct结构体而言,它继承的是ValueType的类,而ValueType本身重写了虚方法
  • 它利用反射来对包含引用类型的值类型进行逐字段比较
  • 如果字段全为值类型,则执行逐字节的比较。
  • 所以一般来说Struct类型含有引用类型的字段时候,应该重写Equals方法,因为ValueType的反射实现会降低性能。
  • 但重写了Equals()并不是最优解,因为它会将结构体本身进行拆箱和装箱,依旧有性能消耗。但是继承IEquatable<T>实现强类型比较
  • 这样当你a.Euqals(A b)的时候会默认优先调用IEquatable<T>的方法
==运算符
  • 如果没有重载,默认使用ceq指令
  • 重载之后调用op_Equality方法
  • 而ceq指令是比较两个寄存器里的值是否相等
注意事项
  • 当使用结构体来作为字典的key时,也需要重写Equals方法,因为字典内部默认调用了Equal方法。如果不进行重写就会消耗性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值