IEquatable「T」和Equal详解

Object.Equal()

  • Object本身有一个方法ReferenceEquals是比较引用是否相等的
  • 一般使用a.Equal(b)的时候,内部调用的是ReferenceEquals
  • Object的Equal()方法是虚方法
  • 对于Struct结构体而言,它继承的是ValueType的类,而ValueType本身重写了虚方法
  • 它利用反射来对包含引用类型的值类型进行逐字段比较
  • 如果字段全为值类型,则执行逐字节的比较。
  • 所以一般来说Struct类型含有引用类型的字段时候,应该重写Equals方法,因为ValueType的反射实现会降低性能。
  • 但重写了Equals()并不是最优解,因为它会将结构体本身进行拆箱和装箱,依旧有性能消耗。但是继承IEquatable实现强类型比较
  • 这样当你a.Euqals(A b)的时候会默认优先调用IEquatable的方法

==运算符

  • 如果没有重载,默认使用ceq指令
  • 重载之后调用op_Equality方法
  • 而ceq指令是比较两个寄存器里的值是否相等

注意事项

  • 当使用结构体来作为字典的key时,也需要重写Equals方法,因为字典内部默认调用了Equal方法。如果不进行重写就会消耗性能。

你可能感兴趣的:(IEquatable「T」和Equal详解)