【发布时间】:2009-02-11 20:49:27
【问题描述】:
为什么 GetHashCode 不是 .NET 中的 HashCode 之类的属性?
【问题讨论】:
为什么 GetHashCode 不是 .NET 中的 HashCode 之类的属性?
【问题讨论】:
可能是因为它需要计算,并且将其作为属性公开可能意味着哈希码已经免费提供。
编辑: 相关指南:Properties versus Methods
“该操作的成本很高,以至于您希望与用户沟通,他们应该考虑缓存结果。”
也许 GetHashCode 在某些情况下已经足够昂贵了。
【讨论】:
我认为没有任何充分的理由。 GetHashCode 的任何实现都应该足够快以放入属性中。也就是说,.Net 框架中有plenty of design flaws,有些小,有些严重。这个好像很小。
【讨论】:
通常不可能为一个类定义一个 HashCode,因为:
例如类的对象不 有一个明确的概念 身份。
因此,通常使 GetHashCode() 方法抛出 NotImplementedException。如果 HashCode 是一个属性,这当然会出现各种问题,因为大多数人(和调试器)认为获取属性的值总是有效的
【讨论】:
除了一个属性只是一个getter和一个setter方法之外,从设计的角度来看,一个属性不应该包含除了初始化或验证之外的任何计算,例如:
private object _obj;
public object Obj
{
get
{
if(_obj == null)
{
_obj = new object();
}
return _obj;
}
set
{
if(value == badvalue)
{
throw new ArgumentException("value");
}
_obj = value;
}
}
GetHashCode() 不包含大量计算,但它可以包含如此长时间运行的操作(只是因为它可以以复杂的方式计算对象的哈希码),这就是为什么它是一个方法而不是一个属性.
【讨论】:
只有在它们背后的计算非常快或缓存时才应该使用属性
除了大多数时候,属性中唯一的逻辑应该是验证
【讨论】:
您必须记住,.NET Framework 旨在支持多种语言。
理论上,您可以创建一个无法正确覆盖属性的编译器。虽然这会产生一个非常糟糕的编译器,但它不一定是非法的。 (记住属性只是带有一些元数据的方法)
【讨论】: