确定实例是否覆盖了 GetHashCode 和 Equals?

Bra*_*non 5 .net c# equality

给定 C# 中对象的实例,如何确定该对象是否具有值语义?换句话说,我想保证我的 API 中使用的对象适合用作字典键。我在想这样的事情:

var type = instance.GetType();
var d1 = FormatterServices.GetUninitializedObject(type);
var d2 = FormatterServices.GetUninitializedObject(type);
Assert.AreEqual(d1.GetHashCode(), d2.GetHashCode());
Run Code Online (Sandbox Code Playgroud)

你怎么看这种方法?

Sri*_*vel 3

FormatterServices.GetUninitializedObject可以使对象处于无效状态;它破坏了只读字段等的保证分配。任何假设字段不会被破坏的代码都会null被破坏。我不会用那个。

您可以通过反射检查 和 是否GetHashCodeEquals覆盖,但这还不够。您可以重写方法调用基类方法。这不算作值语义。

顺便说一句,值语义并不意味着相等的哈希码。这也可能是一次碰撞;值语义意味着两个具有 equals 属性的对象应该返回相同的哈希码,并且 equals 方法应该评估为 true。

我建议您创建一个实例,分配一些属性,然后克隆它;现在两个哈希码应该相等,并且调用的结果object.Equals(original, clone)应该为 true。