我最近遇到过这种情况,到目前为止,我一直在愉快地重写等于运算符(==)和/或Equals方法,以查看两个引用类型是否实际包含相同的数据(即两个看起来相同的不同实例).
我一直在使用它,因为我已经进行了更多的自动化测试(比较参考/预期数据与返回的数据).
在查看MSDN中的一些编码标准指南时,我遇到了一篇建议反对它的文章.现在我理解为什么文章说这个(因为它们不是同一个实例)但它没有回答这个问题:
非常感谢^ _ ^
看起来我错误地阅读了一些文档(这是漫长的一天)并且压倒Equals可能是要走的路.
如果要实现引用类型,则应考虑在引用类型上覆盖Equals方法(如果类型看起来像基本类型,如Point,String,BigNumber等).大多数引用类型不应重载等于运算符,即使它们重写等于.但是,如果要实现旨在具有值语义的引用类型(例如复数类型),则应覆盖相等运算符.
我使用C#HastSet和LINQ的Join方法遇到了一些奇怪的行为,我不明白.我已经简化了我正在做的事情,以帮助专注于我所看到的行为.
我有以下内容:
private HashSet<MyClass> _mySet; // module level
IEnumerable<ISearchKey> searchKeys; // parameter.
// Partial key searches are allowed.
private IEqualityComparer<ICoreKey> _coreKeyComparer; // Module level.
// Compares instances of MyClass and ISearchKey to determine
// if they match.
Run Code Online (Sandbox Code Playgroud)
{searchKey_a, myClass_a1},
{searchKey_a, myClass_a2},
{searchKey_a, myClass_a3},
{searchKey_b, myClass_b1},
{searchKey_b, myClass_b2},
{searchKey_c, myClass_c1},
{searchKey_c, myClass_c2},
{searchKey_c, myClass_c3},
{searchKey_c, myClass_c4},
etc....
Run Code Online (Sandbox Code Playgroud)
ie同一个ISearchKey实例会多次出现,一次为它所连接的每个匹配的MyClass实例.
var matchedPairs = searchKeys
.Join(
_mySet,
searchKey => searchKey,
myClass => …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建和使用只有不可变类,其中所有字段都是只读不可变类型,尽管可能有其他字段是可变的并且不被认为是对象状态的一部分(主要是缓存的哈希码).
在实现IEquatable时,我会像对非不可变对象一样
也就是说,
public bool Equals(MyImmutableType o) =>
object.Equals(this.x, o.x) && object.Equals(this.y, o.y);
Run Code Online (Sandbox Code Playgroud)
现在这是不可变的,这似乎是低效的,对象永远不会改变,如果我可以计算并存储一些独特的指纹,我可以简单地比较指纹而不是整个字段(可以称之为自己的Equals等).
我想知道什么是一个很好的解决方案呢?将BinaryFormatter+ MD5值得探索?