如您所知,GetHashCode返回一个半唯一值,可用于标识集合中的对象实例。作为一种好的做法,建议覆盖此方法并实现自己的方法。
我的问题是 - 在处理自定义对象时是否覆盖此方法?如果是,您使用什么算法生成唯一ID?
我正在考虑生成GUID,然后从该识别器获取整数数据。
答案 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由运行时以您想要的方式实现 - 每个对象都有一个由运行时分配的隐藏字段。
实际上您的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;
}
}