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方法。如果不进行重写就会消耗性能。