我有一个不可变的值对象 IPathwayModule,其值由以下内容定义:
- (int) 块;
- (实体)模块,由(字符串)ModuleId 标识;
- (枚举)状态;和
- (实体)类,由(字符串)ClassId 标识 - 可以为 null。
这是我当前的 IEqualityComparer 实现,它似乎适用于一些单元测试。但是,我认为我不了解自己做得好到足以知道自己做得是否正确。以前的实现有时会在重复测试运行时失败。
private class StandardPathwayModuleComparer : IEqualityComparer<IPathwayModule>
{
public bool Equals(IPathwayModule x, IPathwayModule y)
{
int hx = GetHashCode(x);
int hy = GetHashCode(y);
return hx == hy;
}
public int GetHashCode(IPathwayModule obj)
{
int h;
if (obj.Class != null)
{
h = obj.Block.GetHashCode() + obj.Module.ModuleId.GetHashCode() + obj.Status.GetHashCode() + obj.Class.ClassId.GetHashCode();
}
else
{
h = obj.Block.GetHashCode() + obj.Module.ModuleId.GetHashCode() + obj.Status.GetHashCode() + "NOCLASS".GetHashCode();
}
return h;
}
}
IPathwayModule 绝对是不可变的,具有相同值的不同实例应该相等并产生相同的 HashCode,因为它们被用作 HashSet 中的项目。
我想我的问题是:
- 在这种情况下我是否正确使用了界面?
- 是否存在我可能看不到所需行为的情况?
- 有什么方法可以提高鲁棒性、性能吗?
- 有没有我没有遵循的良好做法?