Gibt es irgendwelche Überlegungen für unveränderliche Typen in Bezug auf Hash-Codes?
Unveränderliche Typen sind am einfachsten korrekt zu hashen; die meisten Hash-Code-Fehler treten beim Hashing veränderlicher Daten auf. Das Wichtigste ist, dass Hashing und Gleichheit übereinstimmen; wenn zwei Instanzen als gleich verglichen werden, sollten sie den gleichen Hash-Code haben. (Der umgekehrte Fall ist nicht notwendigerweise wahr; zwei Instanzen, die den gleichen Hash haben, müssen nicht gleich sein.)
Sollte ich sie einmal im Konstruktor erzeugen?
Das ist eine Technik zur Leistungsoptimierung; auf diese Weise tauschen Sie den erhöhten Platzbedarf (für die Speicherung des berechneten Wertes) gegen eine mögliche Zeitersparnis. I niemals Leistungsoptimierungen vorzunehmen, es sei denn, sie beruhen auf realistischen, kundenorientierten Leistungstests, bei denen die Leistung beider Optionen sorgfältig anhand dokumentierter Ziele gemessen wird. Sie sollten dies tun, wenn Ihre sorgfältig konzipierten Experimente zeigen, dass Sie (1) Ihr Ziel verfehlen, wenn Sie dies nicht tun, und (2) wenn Sie Ihr Ziel erreichen, wenn Sie dies tun.
Wie würden Sie deutlich machen, dass der Hash-Code festgelegt ist?
Ich verstehe die Frage nicht. Ein sich ändernder Hash-Code ist die Ausnahme, nicht die Regel. Hash-Codes sollen immer unveränderlich sein. Wenn sich der Hash-Code eines Objekts ändert, kann das Objekt in einer Hash-Tabelle "verloren" gehen, daher sollte jeder davon ausgehen, dass Hash-Codes stabil bleiben.
Ist es besser, eine Eigenschaft namens HashCode zu verwenden, anstatt die Methode GetHashCode?
Welcher Verbraucher Ihres Objekts wird sagen: "Nun, ich könnte GetHashCode() aufrufen, eine Methode, die garantiert bei allen Objekten vorhanden ist, aber stattdessen rufe ich diesen HashCode-Getter auf, der genau das Gleiche tut"? Haben Sie einen solchen Verbraucher im Sinn?
Wenn Sie keine Verbraucher für die Funktionalität haben, dann stellen Sie die Funktionalität nicht zur Verfügung.