为什么GetHashCode不是像.NET中的HashCode这样的属性

时间:2009-02-11 20:49:28

标签: c# .net hashcode

为什么GetHashCode不是像.NET中的HashCode这样的属性?

6 个答案:

答案 0 :(得分:19)

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

编辑: 有关此问题的指南:Properties versus Methods

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

在某些情况下,GetHashCode可能足够昂贵。

答案 1 :(得分:4)

我认为没有任何理由。任何GetHashCode的实施都应该快速投入财产。也就是说,.Net框架中有plenty of design flaws,有些小,有些严重。这看起来很小。

答案 2 :(得分:2)

通常无法为从那以后生成的类定义HashCode:

  

e.g。班级的对象没有   有一个明确的概念   身份。

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

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

答案 4 :(得分:0)

只有当它们背后的计算真的很快或缓存时才应该使用

属性

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

答案 5 :(得分:-2)

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

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