如您所知,GetHashCode 返回一个半唯一值,可用于标识集合中的对象实例。作为一种好的做法,建议重写此方法并实现您自己的方法。
我的问题是 - 您在处理自定义对象时是否覆盖此方法?如果是这样,您使用什么算法来生成唯一 ID?
我正在考虑生成一个 GUID,然后从该标识符获取整数数据。
如您所知,GetHashCode 返回一个半唯一值,可用于标识集合中的对象实例。作为一种好的做法,建议重写此方法并实现您自己的方法。
我的问题是 - 您在处理自定义对象时是否覆盖此方法?如果是这样,您使用什么算法来生成唯一 ID?
我正在考虑生成一个 GUID,然后从该标识符获取整数数据。
如果您使用 resharper,它可以为您生成 GetHashCode()、Equals 和运算符方法体。
按Alt+访问此菜单Insert。
http://www.jetbrains.com/resharper/webhelp/Code_Generation__Equality_Members.html
当您覆盖时,GetHashCode()
您还需要覆盖Equals()
,operator==
和operator!=
. 并且要非常小心地满足这些方法的所有要求。
指南在 MSDN 上。最重要的报价:
在可变类型中覆盖 operator == 不是一个好主意。
在我个人的使用中,我也只在覆盖 equals 方法时覆盖。通常,我会为我知道可能会运行 LINQ to Objects 查询或其他一些比较操作的对象执行此操作。
如果说 LINQ to SQL 实体或 DTO 对象,我通常会返回主键值。无论您返回什么,如果您不将值存储在本地,则可能会产生意想不到的结果。
HTH。
我通常会覆盖数据类(即值语义有意义的类)的哈希码和相等性检查方法。看看这个问题以获得一个常见的实现。如果您确实覆盖哈希码覆盖等于。使用 GUID 是一个非常糟糕的想法,因为您希望两个不同实例但具有相同值的对象具有相同的哈希码,并且等于返回 true。
如果要覆盖 Equals,则只需要覆盖 GetHashCode。默认的 GetHashCode 由运行时以您想要的类似方式实现 - 每个对象都有一个由运行时分配的隐藏字段。
实际上,您的 IDE 应该为您执行此操作 - 当您键入“override GetHashCode”时,IDE 应该生成此样板代码。Visual Studio 不会这样做,但SharpDevelop会。
通常我使用类的组件属性中聚合的 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;
}
}