386 Stimmen

Welche Vorteile bietet die Kennzeichnung eines Feldes als "schreibgeschützt" in C#?

Welche Vorteile hat es, wenn eine Mitgliedsvariable als schreibgeschützt deklariert ist? Schützt sie nur davor, dass jemand ihren Wert während des Lebenszyklus der Klasse ändert, oder führt die Verwendung dieses Schlüsselworts zu einer Geschwindigkeits- oder Effizienzsteigerung?

223voto

JaredPar Punkte 699699

Ich glaube nicht, dass die Verwendung eines schreibgeschützten Feldes zu einer Leistungssteigerung führt. Es ist einfach eine Überprüfung, um sicherzustellen, dass das Feld nicht auf einen neuen Wert verweisen kann, sobald das Objekt vollständig aufgebaut ist.

Readonly" unterscheidet sich jedoch stark von anderen Arten von Nur-Lese-Semantiken, da es zur Laufzeit von der CLR erzwungen wird. Das readonly-Schlüsselwort lässt sich zu .initonly kompilieren, was von der CLR überprüft werden kann.

Der eigentliche Vorteil dieses Schlüsselworts besteht darin, unveränderliche Datenstrukturen zu erzeugen. Unveränderliche Datenstrukturen können per Definition nicht geändert werden, sobald sie einmal konstruiert sind. Dies macht es sehr einfach, über das Verhalten einer Struktur zur Laufzeit nachzudenken. Es besteht zum Beispiel keine Gefahr, eine unveränderliche Struktur an einen anderen beliebigen Teil des Codes zu übergeben. Die Struktur kann nicht mehr verändert werden, so dass Sie zuverlässig gegen diese Struktur programmieren können.

Robert Pickering hat einen guten Blogbeitrag über die Vorteile der Unveränderlichkeit geschrieben. Der Beitrag kann gefunden werden aquí oder bei der archive.org-Sicherung .

221voto

Bill the Lizard Punkte 384619

Les readonly Schlüsselwort wird verwendet, um eine Mitgliedsvariable als konstant zu deklarieren, ermöglicht aber die Berechnung des Wertes zur Laufzeit. Dies unterscheidet sich von einer Konstante, die mit dem Schlüsselwort const Modifikator, dessen Wert zur Kompilierungszeit festgelegt werden muss. Verwendung von readonly können Sie den Wert des Feldes entweder in der Deklaration oder im Konstruktor des Objekts, zu dem das Feld gehört, festlegen.

Verwenden Sie sie auch, wenn Sie externe DLLs, die auf die Konstante verweisen, nicht neu kompilieren wollen (da sie zur Kompilierzeit ersetzt wird).

83voto

Xiaofu Punkte 14822

Es gibt keine offensichtlichen Leistungsvorteile bei der Verwendung von readonly Zumindest habe ich keine gesehen, die irgendwo erwähnt wurde. Es ist nur dafür da, genau das zu tun, was Sie vorschlagen, nämlich Änderungen zu verhindern, sobald es initialisiert wurde.

Es ist also insofern von Vorteil, als es Ihnen hilft, robusteren, besser lesbaren Code zu schreiben. Der wirkliche Nutzen solcher Dinge ergibt sich, wenn man in einem Team oder bei der Wartung arbeitet. Etwas zu deklarieren als readonly ist gleichbedeutend damit, einen Vertrag für die Verwendung dieser Variablen in den Code einzufügen. Betrachten Sie es als zusätzliche Dokumentation, so wie andere Schlüsselwörter wie internal oder private sagen Sie: "Diese Variable sollte nach der Initialisierung nicht mehr geändert werden", und außerdem sagen Sie Durchsetzung von es.

Wenn Sie also eine Klasse erstellen und einige Mitgliedsvariablen markieren readonly Sie verhindern damit, dass Sie selbst oder ein anderes Teammitglied später einen Fehler machen, wenn sie Ihre Klasse erweitern oder verändern. Meiner Meinung nach ist das ein Vorteil, der es wert ist (auf die kleinen Kosten zusätzlicher Sprachkomplexität, die doofledorfer in den Kommentaren erwähnt).

66voto

Daniel Auger Punkte 12325

Um es ganz praktisch auszudrücken:

Wenn Sie eine Konstante in DLL A verwenden und DLL B auf diese Konstante verweist, wird der Wert dieser Konstante in DLL B kompiliert. Wenn Sie DLL A mit einem neuen Wert für diese Konstante erneut bereitstellen, verwendet DLL B weiterhin den ursprünglichen Wert.

Wenn Sie in DLL A einen Readonly-Wert verwenden und DLL B auf diesen Readonly-Wert verweist, wird dieser Readonly-Wert zur Laufzeit immer nachgeschlagen. Das heißt, wenn Sie die DLL A mit einem neuen Wert für diese Readonly neu bereitstellen, wird DLL B diesen neuen Wert verwenden.

22voto

Kristof Verbiest Punkte 542

Es gibt einen möglichen Fall, in dem der Compiler eine Leistungsoptimierung aufgrund des Vorhandenseins des Schlüsselworts readonly vornehmen kann.

Dies gilt nur, wenn das Nur-Lese-Feld auch als statisch . In diesem Fall kann der JIT-Compiler davon ausgehen, dass sich dieses statische Feld niemals ändern wird. Der JIT-Compiler kann dies bei der Kompilierung der Methoden der Klasse berücksichtigen.

Ein typisches Beispiel: Ihre Klasse könnte eine statische Nur-Lese-Funktion haben IsDebugLoggingEnabled Feld, das im Konstruktor initialisiert wird (z. B. auf der Grundlage einer Konfigurationsdatei). Sobald die eigentlichen Methoden JIT-kompiliert sind, kann der Compiler ganze Teile des Codes auslassen, wenn die Debug-Protokollierung nicht aktiviert ist.

Ich habe nicht überprüft, ob diese Optimierung in der aktuellen Version des JIT-Compilers tatsächlich implementiert ist, daher ist dies nur eine Spekulation.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X