类的默认相等性比较Object.Equals(Object obj)是基于引用相等性的比较。对于结构,Object.Equals(Object)的默认实现通过使用反射来比较类型中每个字段的值,从而执行值相等性检查。
在定义类或者结构时可以为类或者机构创建自定义的值相等比较。创建自定义比较的应用场景通常是预期将类型的对象添加到某个集合中,或者这些对象主要用于存储一组字段或者属性时,需要实现值相等性。自定义的比较的基准是类型中所有或者某些字段或者属性的值相等性比较。其目的是为了提供更高效的方法(比较标准)执行值相等性检查。
创建自定义的类型比较的步骤:
(1).替代虚拟 Object.Equals(Object) 方法。
(2).通过提供类型特定的 Equals 方法实现 System.IEquatable 接口。 实际的等效性比较将在此接口中执行。 例如,可能决定通过仅比较类型中的一两个字段来定义相等性。 不会从 Equals 引发异常。 仅对于类:此方法应仅检查类中声明的字段。 它应调用 base.Equals 来检查基类中的字段。 (如果类型直接从 Object 中继承,则不要这样做,因为 Object.Equals(Object) 的 Object 实现会执行引用相等性检查。)
(3).可选但建议这样做:重载 == 和 != 运算符。(即使类不重载 == 和 != 运算符,也可将这些运算符与类一起使用。 但是,默认行为是执行引用相等性检查。 在类中,如果重载 Equals 方法,则应重载 == 和 != 运算符,但这并不是必需的。对于结构,除非结构显式重载了 == 和 != 运算符,否则默认情况下这些运算符无法对结构进行运算。)
(4).替代 Object.GetHashCode,以便具有值相等性的两个对象生成相同的哈希代码。
(5)可选:若要支持“大于”或“小于”定义,请为类型实现 IComparable 接口,并同时重载 <= 和 >= 运算符。
代码示例
【C#】 为类型(类或者结构)自定义值相等性的比较
最新推荐文章于 2024-02-24 15:57:57 发布