C#中相等的最小代码

时间:2015-08-23 22:44:02

标签: c# equals equality

在这个article中,Eric Lippert在第9点建议C#有太多的平等"。他指出,有9或10种不同的方法或运算符可以重载以提供对象相等。

我的第一个问题是 - 如果覆盖了Object.Equals(object)方法,编译器是否可以调用任何其他相等运算符,如==,!=,< =等,而无需代码明确地执行此操作?

在C ++中,这种行为有先例。编译器可以在需要生成临时变量的某些位置调用复制构造函数。我至少95%确定这不会发生在C#中,但它实际上取决于编译器的构造方式以及边缘情况。

第二个问题是 - 如果编译器永远不会间接调用任何相等运算符,那么小型,中型甚至大型项目是否可以指定只有Object.Equals(object)方法和IEquatable用于相等测试,如果需要用于排序的类型或在需要确定对象的等级时的其他时间使用IComparable?换句话说 - 如果项目中的每个人都同意他们不会被使用并因此是不必要的,那么可以避免定义其他相等运算符吗?

假设代码仅在项目中使用,并且不会被导出以供第三方使用。

1 个答案:

答案 0 :(得分:4)

  

我的第一个问题是 - 如果覆盖了Object.Equals(object)方法,编译器是否可以调用任何其他相等运算符,如==,!=,< =等,而无需代码明确地执行此操作?

不是我知道的。

  

第二个问题是 - 如果编译器永远不会间接调用任何相等运算符,那么小型,中型甚至大型项目是否可以指定只有Object.Equals(object)方法和IEquatable用于相等测试,如果需要用于排序的类型或在需要确定对象的等级时的其他时间使用IComparable?换句话说 - 如果项目中的每个人都同意他们不会被使用并因此是不必要的,那么可以避免定义其他相等运算符吗?

从技术上讲,你的建议是可能的。但在实践中,即使我是唯一一个参与该项目的人,我也不会相信自己能够遵循既定的规范。我也会发现自己担心我所做的每一个LINQ方法调用:这个LINQ方法如何工作?需要IEquatable吗?它使用IComparable吗?我在这里安全吗?

如果我尝试对你所建议的方法采用类似的方法,我可能仍然会让我的类实现所有相关的相等接口,但默认情况下这些方法会抛出NotSupportedException异常。这样,至少我觉得我有一个安全网,以防我错误地使用错误的方法,或者我使用依赖于不同的相等接口的库方法。