Die folgende Szene werden Sie in dieser oder ähnlicher Form sicherlich auch schon in Ihrem Büro erlebt haben:
Herr Meier: „Eine kurze Frage in die Runde: Wie erstelle ich eine Konstante in C#”.
Herr Schmidt: „Das geht ganz einfach mittels const Schlüsselwort“.
Herr Mueller: „Nein, verwende doch lieber readonly statt const“.
Im Prinzip ist Herr Meier aus obigem Beispiel nur einen kleinen Schritt weiter gekommen. Zu Beginn wusste er noch nicht wie er eine Konstante anlegen kann, und nun hat er mehrere Möglichkeiten zur Auswahl ohne zu wissen welche die Richtige ist.
Oder wie es Lee Segal einmal treffend gesagt hat: „It is possible to own too much. A man with one watch knows what time it is; a man with two watches is never quite sure.”
In diesem Artikel möchte ich Ihnen daher die beiden Schlüsselwörter const und readonly vorstellen. Dabei erfahren Sie welches Schlüsselwort wann zum Einsatz kommen sollte.
Const
Ein konstanter Wert kann mittels const Schlüsselwort erstellt werden. Der nachfolgende Quellcode zeigt die entsprechende Syntax.
1 public const double Pi = 3.14159;
Wie Sie sehen erfolgen Deklaration und Definition der Konstante gemeinsam in einer Anweisung. Der angegebene Wert ist dadurch bereits zur Übersetzungszeit bekannt und kann vom Compiler ausgewertet werden. Der Compiler nutzt diesen Fakt und optimiert den Quellcode. Er ersetzt dabei alle Vorkommen der Konstanten durch den entsprechenden Wert. Diese Compileroptimierung kann ungewünschte Nebenwirkungen haben wenn das Projekt aus mehreren Assemblies besteht.
Beispiel:
Eine Konstante wird in Assembly A erstellt und in Assembly B verwendet. Wird der Wert der Konstante in A geändert und neu kompiliert, dann werden alle Verwendungen der Konstante in A aktualisiert. Die Assembly B nutzt aber immer noch die alten Werte. Auch B muss daher neu kompiliert werden. Dies ist besonders gefährlich bei Assemblies welche nicht in einem gemeinsamen Projekt enthalten sind. In diesem Fall wird oft vergessen dass Assembly B neu kompiliert werden muss.
Readonly
Mittels readonly kann ebenfalls ein konstanter Wert erzeugt werden. Wie der nachfolgende Quellcode zeigt, werden dabei aber Deklaration und Definition getrennt.
1 public class Example
2 {
3 public Example()
4 {
5 ValueAddedTax = 19.0;
6 }
7
8 public readonly double ValueAddedTax;
9 }
Die Definition erfolgt im Konstruktor. Da der Konstruktor aber erst zur Laufzeit ausgeführt wird, kann der Compiler zur Übersetzungszeit die Konstante nicht durch den entsprechenden Wert ersetzen. Dies erfolgt erst zur Laufzeit. Das zuvor bei const geschilderte Problem im Szenario mit zwei Assemblies tritt hier nicht auf.
Verwendung
Aus den zuvor geschilderten Gründen ergibt sich der jeweilige Verwendungszweck der beiden Schlüsselwörter.
– const sollte für unveränderliche Werte verwendet werden, also Werte die sich unter gar keinen Umständen ändern. (z.B. die Kreiszahl Pi)
– readonly sollte für veränderliche Werte verwendet werden, also Werte die zwar scheinbar konstant sind, sich aber unter Umständen ändern können. (z.B. Prozentsatz der Mehrwertsteuer)
Fazit
Der Unterschied zwischen const und readonly ist zwar klein, kann bei Nichtbeachtung aber negative Auswirkungen nach sich ziehen. Wer auf Nummer sicher gehen und sich nicht mit den feinen Unterschieden der beiden Möglichkeiten befassen möchte, sollte immer readonly verwenden.