c# - how - Warum GetHashCode ist keine Eigenschaft wie HashCode in.NET



c# override gethashcode best practice (4)

Eigenschaften sollten nur verwendet werden, wenn die Berechnung hinter ihnen wirklich schnell oder zwischengespeichert ist

Außerdem sollte die einzige Logik in Eigenschaften die Validierung sein

https://src-bin.com

Warum ist GetHashCode keine Eigenschaft wie HashCode in .NET?


Answer #1

Sie müssen daran denken, dass das .NET Framework für den Zugriff auf eine Vielzahl von Sprachen ausgelegt ist.

Theoretisch könnten Sie einen Compiler erstellen, der Eigenschaften nicht korrekt überschreiben kann. Während das für einen ziemlich beschissenen Compiler wäre, wäre es nicht unbedingt illegal. (Remember-Eigenschaften sind nur Methoden mit einigen Metadaten)


Answer #2

Abgesehen davon, dass eine Eigenschaft nichts anderes als eine Getter- und Setter-Methode ist, sollte eine Eigenschaft aus Design-Sicht niemals andere Berechnungen als die Initialisierung oder Validierung enthalten, zB:

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 () enthält keine umfangreichen Berechnungen, könnte aber so lange laufende Operationen enthalten (nur weil es den Hashcode eines Objekts auf komplexe Weise berechnen könnte), deshalb ist es eine Methode anstelle einer Eigenschaft.


Answer #3

Häufig ist es nicht möglich, einen HashCode für eine Klasse zu definieren, die Folgendes ausführt:

zB haben die Objekte der Klasse kein klar definiertes Identitätskonzept.

Daher ist es üblich, dass die GetHashCode () -Methode eine NotImplementedException auslöst. Dies würde natürlich jedes Problem verursachen, wenn HashCode eine Eigenschaft wäre, da die meisten Leute (und Debugger) davon ausgehen, dass es immer gültig ist, den Wert einer Eigenschaft zu erhalten





hashcode