Joan Venge
Joan Venge

Reputation: 330862

Why GetHashCode is not a property like HashCode in .NET

Why GetHashCode is not a property like HashCode in .NET?

Upvotes: 10

Views: 1368

Answers (6)

Ian Ringrose
Ian Ringrose

Reputation: 51897

Often it is not possible to define a HashCode for a class that makes since:

e.g. the objects of the class don’t have a well defined concept of identity.

Therefore it is common to make the GetHashCode() method throw a NotImplementedException. This would course all sort of problem if HashCode was a property, as most people (and debuggers) assume it is always valid to get the value of a property

Upvotes: 2

haze4real
haze4real

Reputation: 738

Besides that a property is nothing else than a getter and a setter method, from a design perspective a property should never contain any computations other than initializing or validation, eg:

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() does not contain extensive computations, but it could contain such long running operations (just from the fact that it could compute the hashcode of an object in a complex manner), this is why its a method instead of a property.

Upvotes: 1

Guvante
Guvante

Reputation: 19203

You have to remember that the .NET Framework is designed to be accessed by a wide variety of languages.

In theory you could create a compiler that is incapable of correctly overriding properties. While that would make for a pretty crappy compiler, it would not necessarily be illegal. (Remember properties are just methods with some meta data)

Upvotes: -2

LDomagala
LDomagala

Reputation: 2202

properties should only be used if the computation behind them is really fast or cached

besides most of the time the only logic in properties should be validation

Upvotes: 0

Scott Weinstein
Scott Weinstein

Reputation: 19117

I don't think there's any good reason. Any implemention of GetHashCode should be fast enought to put into a property. That said, there are plenty of design flaws in the .Net framework, some small, some serious. This seems like a small one.

Upvotes: 4

MichaelGG
MichaelGG

Reputation: 10006

Probably because it requires computation, and exposing it as a propery might imply that the hashcode is already available for free.

Edit: Guidelines on this: Properties versus Methods

"The operation is expensive enough that you want to communicate to the user that they should consider caching the result."

Perhaps GetHashCode is expensive enough in some cases.

Upvotes: 19

Related Questions