为什么 GetHashCode 不是 .NET 中的 HashCode 之类的属性?
6 回答
可能是因为它需要计算,并且将其作为属性公开可能意味着哈希码已经免费提供。
编辑: 关于此的指南:属性与方法
“该操作非常昂贵,以至于您希望与用户沟通,他们应该考虑缓存结果。”
也许 GetHashCode 在某些情况下已经足够昂贵了。
我不认为有什么好的理由。的任何实现都GetHashCode
应该足够快以放入属性中。也就是说,.Net 框架中有很多设计缺陷,有的很小,有的很严重。这个好像很小。
通常不可能为一个类定义一个 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 旨在通过多种语言进行访问。
理论上,您可以创建一个无法正确覆盖属性的编译器。虽然这会产生一个非常糟糕的编译器,但它不一定是非法的。(记住属性只是一些元数据的方法)