33

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

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

我正在考虑生成一个 GUID,然后从该标识符获取整数数据。

4

6 回答 6

29

如果您使用 resharper,它可以为您生成 GetHashCode()、Equals 和运算符方法体。

Alt+访问此菜单Insert

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

于 2010-12-02T16:52:47.413 回答
27

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

指南在 MSDN 上。最重要的报价:

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

于 2010-11-21T22:07:51.860 回答
1

在我个人的使用中,我也只在覆盖 equals 方法时覆盖。通常,我会为我知道可能会运行 LINQ to Objects 查询或其他一些比较操作的对象执行此操作。

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

HTH。

于 2010-11-21T21:33:03.873 回答
1

我通常会覆盖数据类(即值语义有意义的类)的哈希码和相等性检查方法。看看这个问题以获得一个常见的实现。如果您确实覆盖哈希码覆盖等于。使用 GUID 是一个非常糟糕的想法,因为您希望两个不同实例但具有相同的对象具有相同的哈希码,并且等于返回 true。

于 2010-11-21T21:43:42.270 回答
0

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

如何覆盖 GetHashCode

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

于 2010-11-21T21:41:45.233 回答
-2

通常我使用类的组件属性中聚合的 GetHashCode。例如

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;
  }
}
于 2010-11-21T21:30:41.320 回答