我对您在实现一个用于在 C# 中编写集成/系统测试的小型库时出现的问题的意见很感兴趣。该库由两部分组成:测试创作 API 和测试运行时 API。测试编写者使用创作 API 来构建测试计划原型。运行时可以获取原型并创建原型的运行时表示并执行它。
为了能够测试名为 RuntimeTestPlanBuilder 的类,我必须在整个运行时对象模型类上重写 Equals 方法。这导致了我也应该重写 GetHashCode 方法的情况。为一些运行时对象模型类实现 GetHashCode 很容易。由于运行时模型上的某些类是为它们实现 GetHashCode 的容器,这很难甚至是不可能的(例如,由于运行时可以将项目添加到容器中,因此无法在 O(1) 中计算哈希码)。
结果,我发现自己想知道如何防止容器的用户将它们作为键放在字典中。我选择的解决方案是重写 GetHashCode 方法并抛出异常。我对这个解决方案不满意,因为它只会在运行时失败。另外,我有点想知道为什么 .Net Framework 设计者选择将 GetHashCode 方法放在 Object 类上。我认为这个决定导致了我的情况,因为我不能很好地将我的容器标记为不合法的字典键。
一个更好的决定(对于 .Net Framework 设计人员)可能是定义一个名为 IHashable 的接口,其中包含 2 个方法:Equals 和 GetHashCode,并通过对通用字典 Item 类型的约束来强制执行该接口。这样我们可以在编译时强制键实现 Equals 和 GetHashCode。此外,很容易理解,不实现此接口的类不应该用作字典键。
我的问题是:您能否提出一个更好的解决方案(一个不会从 GetHashCode 引发异常的解决方案)来指定某些类的实例不应用作字典键?
谢谢