Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在通用基类中重写GetHashCode_C# - Fatal编程技术网

C# 如何在通用基类中重写GetHashCode

C# 如何在通用基类中重写GetHashCode,c#,C#,互联网上有很多关于在重写等于时如何重写GetHashCode()的信息。但是,所有这些示例都是关于包含一些可以生成哈希的字段的类。 我试图找到的是一个很好的GetHashCode实现,它是我用于所有业务logica层对象的基类。这个名为BusinessLogica的类包含一个ToString()实现、我的框架的一些基本功能以及以下内容: public override bool Equals(object obj) { bool retValue;

互联网上有很多关于在重写等于时如何重写GetHashCode()的信息。但是,所有这些示例都是关于包含一些可以生成哈希的字段的类。 我试图找到的是一个很好的GetHashCode实现,它是我用于所有业务logica层对象的基类。这个名为BusinessLogica的类包含一个ToString()实现、我的框架的一些基本功能以及以下内容:

    public override bool Equals(object obj)
    {
        bool retValue;

        if (obj is BusinessLogica && this.GetType() == obj.GetType())
        {
            retValue = this.ID == ((BusinessLogica)obj).ID;
        }
        else
        {
            retValue = false;
        }

        return retValue;
    }
现在,到目前为止我所做的是,当我需要一个扩展这个BusinessLogica的对象,并将其用作字典中的键时,我会覆盖这个特定类中的GetHashCode并返回ID。 我还可以在BusinessLogica基类中使用此实现。这“安全”吗?我还看到了返回ToString().GetHashCode()的示例


使用什么是明智的?或者这个级别的GetHashCode不可用,我真的应该在我的每一个BusinessLogica类中重写它吗?

因为您只使用
ID
属性来测试相等性,所以这几乎肯定也是您应该用来派生hashcode的


如果
ID
Int32
,那么从
GetHashCode
方法返回
this.ID
应该可以。如果
ID
是其他类型,那么您可以返回
this.ID.GetHashCode()

我认为一般的想法是-如果您重新定义了equals,那么以下不变量必须保持不变

2个相等的对象必须具有相同的哈希代码。(反过来可能不正确)。

另请参见此问题以了解实现-。但是,在您的示例中,我认为您可以使用ID属性生成hashcode

假设:它支持上述不变量。它也是不可变的,一旦创建了一个对象,ID就不应该改变。

等于(…)
GetHashCode(…)
应该总是等价地实现


如果您确定您的对象通过其
ID
相等(尽管这是有争议的),那么您还应该返回
ID

的HashCode,因为您使用ID来确定对象是否相等
GetHashCode
实现也应该使用ID:

public override int GetHashCode()
{
  return this.ID.GetHashCode();
}

在编写
Equals
GetHashCode
方法时,最重要的一点是,你永远不应该有一个没有另一个的方法,而且它们是一致的。因此,在这种情况下,返回
ID
作为散列码(或相同的
ID
的散列码)是完全可以的