Unterschied zwischen Konstanten und ReadOnly

Es ist wichtig, die Konzepte der C # -Programmierung zu verstehen, bevor Sie mit der Implementierung des Codes fortfahren. Bevor wir zu den Unterschieden zwischen const und readonly springen, sollten wir zuerst die Schlüsselwörter und deren Verwendung in einem Programm verstehen. Beide sind die am häufigsten verwendeten Schlüsselwörter in der C # -Programmierung und dienen im Wesentlichen demselben Zweck. Beide Schlüsselwörter unterscheiden sich jedoch stark voneinander. Const ist ein reserviertes Wort, das zur Darstellung konstanter Werte verwendet wird. Es gibt an, dass ein Wert nach der Kompilierzeit nicht geändert werden kann, während Readonly ein Modifikator ist, der für Felder verwendet werden kann und dessen Wert während der Laufzeit geändert werden kann. Schauen wir uns einige der wichtigsten Unterschiede zwischen const und readonly an.

Was ist ein Const?

Const bezieht sich auf eine konstante Variable, deren Wert bei der Deklaration nur einmal vergeben werden muss. Wenn das Schlüsselwort const während einer Deklaration verwendet wird, wird es konstant, dh der Wert bleibt konstant und kann nicht im gesamten Programm geändert werden. Es ist eher ein reserviertes Wort, das angibt, dass ein Wert nach der Kompilierzeit nicht geändert werden darf. Ein const ist standardmäßig implizit statisch und kann daher mit dem Klassennamen mit „Classname.VariableName“ aufgerufen werden. Die konstanten Werte werden auch als Literale bezeichnet. Es kann einen beliebigen Basisdatentyp haben, z. B. eine Ganzzahlkonstante, eine Fließkonstante oder ein Stringliteral.

Was ist ReadOnly??

Das Schlüsselwort Readonly ist ein Modifikator, der nur für Felder, nicht jedoch für lokale Variablen verwendet werden kann. Ein Readonly-Feld kann entweder zum Zeitpunkt der Deklaration oder innerhalb eines Konstruktors in derselben Klasse initialisiert werden, sodass die Werte für unterschiedliche Ausführungen des Programms je nach verwendetem Konstruktor unterschiedlich sein können. Das Schlüsselwort readonly gibt an, dass eine Instanzvariable eines Objekts nicht geändert werden kann. Jeder Versuch, sie nach der Deklaration zu ändern, führt zu einem Kompilierungsfehler. Die Variable kann erst nach der Ausführung geändert werden. Variablen werden nur als "readonly" erstellt, um zu verhindern, dass der Code nach seiner Erstellung versehentlich geändert wird.

Unterschied zwischen Constant und ReadOnly

  1. Basic

Konstante (const) Schlüsselwörter sind nichts anderes als unveränderliche Variablen, deren Wert nur zur Kompilierzeit initialisiert werden kann. Diese konstanten Werte werden auch als Literale bezeichnet. Es erlaubt uns einfach anzugeben, ob eine Variable geändert werden kann oder nicht. Einfach ausgedrückt sind Konstanten implizit statisch und sollten initialisiert werden, bevor sie im Programm verwendet werden können. Das Schlüsselwort Readonly hingegen ist ein Modifikator, der für Felder verwendet werden kann und dessen Wert während der Laufzeit geändert werden kann. Es verhindert, dass Felder geändert werden und deren Werte über Referenzvariablen festgelegt werden können.

  1. Initialisierung

Eine const ist standardmäßig statisch und deren Werte zum Zeitpunkt der Variablendeklaration zugewiesen werden sollen, was bedeutet, dass die Werte nur zur Kompilierzeit zugewiesen werden. Eine Konstante wird mit dem Schlüsselwort "const" deklariert. Die Initialisierung eines konstanten Feldes muss ein konstanter Ausdruck sein und darf nicht geändert werden. Einfach ausgedrückt ist ein const eine Konstante für die Kompilierungszeit. Ein Readonly-Feld kann dagegen nur auf Klassenebene und nicht innerhalb der Methode initialisiert werden, und das Feld kann nach der Initialisierung nicht geändert werden. Mit anderen Worten, readonly-Variablen können zum Zeitpunkt der Deklaration oder innerhalb eines Konstruktors initialisiert werden.

  1. Speicherzuweisung

Ein const-Wert wird direkt in den Code eingefügt, da er als Ersetzung während der Kompilierung fungiert. Der Compiler fügt den konstanten Wert in die Assembly-Metadaten ein, die die Konstante definieren, und bettet den Wert nach der Initialisierung in den IL-Code ein, sodass für Konstanten zur Laufzeit kein Speicher für die Zuweisung erforderlich ist. Der Readonly-Wert ist nicht konstant und wird im Loader-Heap gespeichert, dessen Speicher nicht zugeordnet werden kann, bis der Typ geladen ist. Die Readonly-Felder werden im dynamischen Speicher gespeichert, sodass die Werte nur zur Laufzeit abgerufen werden können.

  1. Binäre Versionierung

Obwohl beide Schlüsselwörter fast zu demselben Zweck verwendet werden, weisen sie unterschiedliche binäre Versionierungssemantiken auf. Wenn ein Ausdruck auf eine Konstante verweist, bettet der Compiler den Wert zur Kompilierzeit ein. Wenn der Wert also in einer anderen Assembly verwendet wird, muss die ursprüngliche Assembly aktualisiert werden, und der Wert sollte geändert werden. Die Änderungen in der Assembly werden erst wiedergegeben, wenn sie neu kompiliert werden. Der Wert wird erst zur Laufzeit abgerufen, wenn ein Ausdruck auf ein Readonly-Feld verweist. Wenn der Wert in einer anderen Assembly geändert wird, werden die Änderungen in der Assembly übernommen, sobald sie geladen wird, ohne dass eine erneute Kompilierung erforderlich ist.

Const vs. Readonly: Vergleichstabelle

Zusammenfassung von Const vs. Readonly

Beide Schlüsselwörter werden für dasselbe verwendet, mit dem ein Mitglied deklariert wird, sodass die Werte nicht im gesamten Programm geändert werden können. Das Schlüsselwort const unterscheidet sich jedoch erheblich vom Schlüsselwort readonly. Const ist eine konstante Variable, deren Wert zur Kompilierzeit initialisiert werden sollte, während ein schreibgeschütztes Feld nur auf Klassenebene entweder zum Zeitpunkt der Deklaration oder innerhalb des Konstruktors initialisiert werden kann. Const ist eine Konstante zur Kompilierzeit, während Readonly-Felder nur gelesen werden können. Auf Konstanzvariablen kann mit "Classname.VariableName" zugegriffen werden, während auf readonly-Variablen mit "InstanceName.VariableName" zugegriffen werden kann. Darüber hinaus können const-Variablen in Methoden deklariert werden, während readonly-Felder in Methoden nicht deklariert werden können.