Domanda

Perché GetHashCode non è una proprietà come HashCode in .NET?

È stato utile?

Soluzione

Non credo che ci sia una buona ragione. Qualsiasi L'implementazione di GetHashCode dovrebbe essere veloce sufficienti per mettere in una proprietà. Detto questo, ci sono un sacco di difetti di progettazione nel framework .Net, alcune piccole, alcuni gravi . Questo mi sembra uno piccolo.

Altri suggerimenti

Probabilmente perché richiede il calcolo, ed esponendo come un propery potrebbe implicare che il codice hash è già disponibile gratuitamente.

Modifica: Linee guida su questo: proprietà rispetto ai metodi

"L'operazione è abbastanza costoso che si desidera comunicare all'utente che dovrebbero considerare cache il risultato".

Forse GetHashCode è abbastanza costoso in alcuni casi.

Spesso non è possibile definire una HashCode per una classe che fa da allora:

  

es. gli oggetti della classe non lo fanno   avere un concetto ben definito di   identità.

Per questo è comune a rendere il metodo GetHashCode () gettare un NotImplementedException. Ciò naturalmente ogni sorta di problema se HashCode era una proprietà, come la maggior parte delle persone (e debugger) assumono è sempre valida per ottenere il valore di una proprietà

Oltre che una proprietà non è altro che un getter e un metodo setter, dal punto di vista di design di una proprietà non dovrebbe mai contenere calcoli diversi l'inizializzazione o la convalida, ad esempio:

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 () non contiene ampi calcoli, ma potrebbe contenere tali operazioni esecuzione prolungata (solo dal fatto che potrebbe calcolare il codice hash di un oggetto in modo complesso), questo è il motivo per cui il suo un metodo invece di una proprietà .

proprietà devono essere utilizzati solo se il calcolo dietro di loro è veramente veloce o cache

Oltre il più delle volte l'unica logica in proprietà dovrebbe essere la validazione

Si deve ricordare che il .NET Framework è progettato per essere accessibile da una grande varietà di lingue.

In teoria si potrebbe creare un compilatore che è incapace di proprietà correttamente imperativi. Mentre che renderebbe per un compilatore piuttosto scadente, non sarebbe necessariamente essere illegale. (Ricordate proprietà sono a soli metodi con un po 'di meta dati)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top