10

为什么 GetHashCode 不是 .NET 中的 HashCode 之类的属性?

4

6 回答 6

19

可能是因为它需要计算,并且将其作为属性公开可能意味着哈希码已经免费提供。

编辑: 关于此的指南:属性与方法

“该操作非常昂贵,以至于您希望与用户沟通,他们应该考虑缓存结果。”

也许 GetHashCode 在某些情况下已经足够昂贵了。

于 2009-02-11T20:51:49.273 回答
4

我不认为有什么好的理由。的任何实现都GetHashCode应该足够快以放入属性中。也就是说,.Net 框架中有很多设计缺陷,有的很小,有的很严重。这个好像很小。

于 2009-02-11T21:08:51.107 回答
2

通常不可能为一个类定义一个 HashCode,因为:

例如,类的对象没有明确定义的身份概念。

因此,通常使 GetHashCode() 方法抛出 NotImplementedException。如果 HashCode 是一个属性,这当然会出现各种问题,因为大多数人(和调试器)认为获取属性的值总是有效的

于 2010-04-28T15:09:15.250 回答
1

除了一个属性只不过是一个 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() 不包含大量计算,但它可以包含如此长时间运行的操作(只是因为它可以以复杂的方式计算对象的哈希码),这就是为什么它是方法而不是属性的原因。

于 2009-07-02T11:07:37.010 回答
0

仅当它们背后的计算非常快或缓存时才应使用属性

除了大多数时候,属性中唯一的逻辑应该是验证

于 2009-02-11T21:11:05.220 回答
-2

您必须记住,.NET Framework 旨在通过多种语言进行访问。

理论上,您可以创建一个无法正确覆盖属性的编译器。虽然这会产生一个非常糟糕的编译器,但它不一定是非法的。(记住属性只是一些元数据的方法)

于 2009-02-11T21:14:12.810 回答