为什么GetHashCode不是像.NET中的HashCode这样的属性?
答案 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旨在通过各种语言进行访问。
理论上,您可以创建一个无法正确覆盖属性的编译器。虽然这会使一个非常糟糕的编译器,但它不一定是非法的。 (记住属性只是带有一些元数据的方法)