c# - 当对象的标识符为空时,GetHashCode 应该返回什么?

标签 c# gethashcode iequatable

考虑到身份属性可能为空,以下哪项是正确的/更好。

public override int GetHashCode()
{
    if (ID == null) {
        return base.GetHashCode();
    }
    return ID.GetHashCode();
}

public override int GetHashCode()
{
    if (ID != null) {
        return ID.GetHashCode();
    }
     return 0;
}

更新 1:更新了第二个选项。

更新 2:以下是 Equals 实现:

public bool Equals(IContract other)
{
    if (other == null)
        return false;
    if (this.ID.Equals(other.ID)) {
        return true;
    }
    return false;
}

public override bool Equals(object obj)
{
    if (obj == null)
        return base.Equals(obj);
    if (!obj is IContract) {
        throw new InvalidCastException("The 'obj' argument is not an IContract object.");
    } else {
        return Equals((IContract)obj);
    }
}

ID为string类型。

最佳答案

这实际上取决于您想要相等的含义 - 重要的是两个相等的对象返回相同的哈希码。 ID 为空时相等意味着什么?目前,如果 ID 属性具有相同的值,您的 Equals 方法将必须返回真...但我们不知道如果 ID 为 null 时它会做什么。

如果您确实想要第一个版本的行为,我个人会使用:

return ID == null ? base.GetHashCode() : ID.GetHashCode();

编辑:根据您的 Equals 方法,看起来您可以制作 GetHashCode 方法:

return ID == null ? 0 : ID.GetHashCode();

请注意,您的 Equals(IContract other) 方法也可能如下所示:

return other != null && object.Equals(this.ID, other.ID);

如果 this.ID 为空,您当前的实现实际上会抛出异常...

此外,您的 Equals(object) 方法不正确 - 如果您传递了不合适的对象类型,您不应该抛出异常,您应该只返回 false ... 如果 obj 为 null,则同上。所以你实际上可以使用:

public override bool Equals(object obj)
{
    return Equals(obj as IContract);
}

但是,我担心基于接口(interface)的相等性。通常,即使实现相同的接口(interface),两个不同类型的类也不应该被认为是相等的。

关于c# - 当对象的标识符为空时,GetHashCode 应该返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5078149/

相关文章:

c# - IEquatable<T>、IComparable<T> 是否应该在非密封类上实现?

linq - Linq GroupBy 使用 Default EqualityComparer 的主要比较

c# - 无法从格式为 25-OCT-13 01.08.24.732000000 PM 的 Excel 文件解析 asp.net 中的日期时间

c# - 如何通过 Internet 部署 Windows 应用程序

c# - System.Type的GetHashCode返回不同​​的值

c# - 有完整的IEquatable实现引用吗?

c# - 我应该使用通用实用程序从多个字段生成 HashCode 吗?

entity-framework-4 - 为 POCO 实现 IEquatable

c# - 调试时如何将 Visual Studio 异常消息语言更改为英语

c# - 限时杀进程的逻辑