覆盖GetHashCode

时间:2010-11-21 21:27:57

标签: c# algorithm methods override gethashcode

如您所知,GetHashCode返回一个半唯一值,可用于标识集合中的对象实例。作为一种好的做法,建议覆盖此方法并实现自己的方法。

我的问题是 - 在处理自定义对象时是否覆盖此方法?如果是,您使用什么算法生成唯一ID?

我正在考虑生成GUID,然后从该识别器获取整数数据。

6 个答案:

答案 0 :(得分:29)

如果你使用resharper,它可以为你生成GetHashCode(),Equals和operator方法体。

Alt + 插入访问此菜单。

http://www.jetbrains.com/resharper/webhelp/Code_Generation__Equality_Members.html

答案 1 :(得分:25)

当您覆盖GetHashCode()时,您还需要覆盖Equals()operator==operator!=。并且要非常小心地满足这些方法的所有要求。

指南为here on MSDN。最重要的是:

  

在非不可变类型中覆盖operator ==不是一个好主意。

答案 2 :(得分:1)

在我的个人用法中,我也只在覆盖equals方法时覆盖。一般来说,我这样做的对象我知道我可能会运行LINQ to Objects查询,或者其他一些比较操作。

我通常会返回一个LINQ to SQL实体或DTO对象的主键值。无论你返回什么,如果你没有在本地存储值,它可能会产生意想不到的结果。

HTH。

答案 3 :(得分:1)

我通常会覆盖数据类的哈希码和等式检查方法(即值语义有意义的类)。查看常见实施的this问题。如果你覆盖hashcode override equals。使用GUID是一个非常糟糕的想法,因为你想要两个不同实例但具有相同的对象具有相同的哈希码,并且等于返回true。

答案 4 :(得分:0)

如果要覆盖Equals,则只需覆盖GetHashCode。默认的GetHashCode由运行时以您想要的方式实现 - 每个对象都有一个由运行时分配的隐藏字段。

How to override GetHashCode

实际上您的IDE应该为您执行此操作 - 当您键入“覆盖GetHashCode”时,IDE应生成此样板代码。 Visual Studio不会这样做,但SharpDevelop会这样做。

答案 5 :(得分:-2)

通常我使用来自类的组件属性的聚合GetHashCode。 E.g。

public class Test
{
  public string Text { get; set; }
  public int Age { get; set; }

  public override GetHashCode()
  {
    int result = 
      string.IsNullOrEmpty(Text) ? 0 : Text.GetHashCode()
      + Age.GetHashCode();

    return result;
  }
}