给定 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)
你怎么看这种方法?
FormatterServices.GetUninitializedObject
可以使对象处于无效状态;它破坏了只读字段等的保证分配。任何假设字段不会被破坏的代码都会null
被破坏。我不会用那个。
您可以通过反射检查 和 是否GetHashCode
被Equals
覆盖,但这还不够。您可以重写方法调用基类方法。这不算作值语义。
顺便说一句,值语义并不意味着相等的哈希码。这也可能是一次碰撞;值语义意味着两个具有 equals 属性的对象应该返回相同的哈希码,并且 equals 方法应该评估为 true。
我建议您创建一个实例,分配一些属性,然后克隆它;现在两个哈希码应该相等,并且调用的结果object.Equals(original, clone)
应该为 true。
归档时间: |
|
查看次数: |
110 次 |
最近记录: |