gpt4 book ai didi

c# - C# 中相等性的最少代码

转载 作者:太空狗 更新时间:2023-10-30 00:18:42 26 4
gpt4 key购买 nike

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

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

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

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

假设代码只在项目内部使用,不会导出给第三方使用。

最佳答案

if the Object.Equals(object) method is overridden, is it possible for the compiler to call any of the other equality operators like ==, !=, <=, etc. without code that expressly performs this operation?

C# 编译器不知道 Equals==在语义上是相同的。如果您调用 Equals然后将调用该方法。

then would it be ok for a small, medium, or even large project to specify that only the Object.Equals(object) method and IEquatable be used for equality testing, and IComparable used if the type will be used for sorting or other times when determining the rank of the objects is needed? In other words - is it ok to avoid defining the other equality operators if everyone on the project agrees they won't be used and are therefore unnecessary?

你在这里遇到的危险是你得到一个 ==为您定义的运算符,默认情况下引用相等。您很容易陷入重载的情况 Equals方法确实值相等和 ==确实引用相等,然后您不小心在值相等的非引用相等事物上使用了引用相等。这是一种容易出错的做法,人工代码审查很难发现。

几年前,我研究了一种静态分析算法来统计检测这种情况,我们发现在我们研究的所有代码库中,每百万行代码的缺陷率约为 2 个。当只考虑在某处被覆盖的代码库时 Equals ,次品率明显高了很多!

此外,考虑成本与风险。如果您已经实现了 IComparable然后编写所有运算符是微不足道的单行代码,不会有错误并且永远不会更改。这是您编写的最便宜的代码。如果要在编写和测试十几个小方法的固定成本与查找和修复使用引用相等而不是值相等的难以发现的错误之间进行选择,我知道我会选择哪个。

关于c# - C# 中相等性的最少代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32172273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com