This article has been localized into German by the community.
Konstanten (const)
Bis jetzt haben wir uns sehr mit Variablen beschäftigt und wie der Name schon sagt, können Variablen immer geändert werden. Das Gegenteil davon ist eine Konstante, die in C# mit dem Schlüsselwort const eingeführt wird. Wenn Sie eine Konstante deklarieren, müssen Sie ihr sofort einen Wert zuweisen, und danach können keine Änderungen am Wert dieser Konstante vorgenommen werden. Das ist großartig, wenn Sie einen Wert haben, der sich niemals ändert, und Sie möchten sicherstellen, dass er nicht versehentlich von Ihrem Code manipuliert wird.
Sie finden viele Konstanten im Rahmen selbst, z.B.: in der Math-Klasse, wo eine Konstante für PI definiert wurde:
Console.WriteLine(Math.PI);
Aber natürlich ist es interessant, einige Konstanten zu deklarieren. Eine Konstante kann im Rahmen einer Methode wie folgt definiert werden:
static void Main(string[] args)
{
const int TheAnswerToLife = 42;
Console.WriteLine("The answer to life, the universe and everything: " + TheAnswerToLife);
}
Die meisten Konstanten werden jedoch auf Klassenebene deklariert, so dass sie auf alle Methoden der Klasse und sogar außerhalb der Klasse, abhängig von der Sichtbarkeit, zugegriffen werden kann (aber natürlich nicht geändert). Eine Konstante verhält sich wie ein statisches Mitglied der Klasse, d.h. Sie können darauf zugreifen, ohne die Klasse zu instanziieren. In diesem Sinne versuchen wir ein vollständiges Beispiel, in dem zwei Konstanten definiert sind - eine private und eine öffentliche Konstante:
using System;
namespace Constants
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("The fake answer to life: " + SomeClass.TheFakeAnswerToLife);
Console.WriteLine("The real answer to life: " + SomeClass.GetAnswer());
}
}
class SomeClass
{
private const int TheAnswerToLife = 42;
public const int TheFakeAnswerToLife = 43;
public static int GetAnswer()
{
return TheAnswerToLife;
}
}
}
Beachten Sie, wie ich eine Klasse (SomeClass) mit zwei Konstanten definiere. Die erste ist privat, also kann es nur von der Klasse selbst, aber die andere ist öffentlich kann also von außen zugänglich sein. In meinem Hauptprogrammcode greife ich also auf beide Konstanten unterschiedlich zu - zuerst direkt, da die gefälschte Antwort öffentlich verfügbar ist, und zweitens mit Hilfe der GetAnswer() - Methode.
Welche Typen können als Konstante verwendet werden?
Da Konstanten sofort deklariert werden müssen und später nicht mehr geändert werden können, muss der Wert, den Sie einer Konstanten zuweisen, ein konstanter Ausdruck sein und der Compiler muss den Wert bereits zur Kompilierzeit auswerten können. Dies bedeutet, dass Zahlen, boolesche Werte und Strings für eine Konstante einfach verwendet werden können, während z.B.: Ein DateTime-Objekt nicht als Konstante verwendet werden kann.
Da der Compiler den Wert sofort kennen muss, bedeutet dies auch, dass es einige Einschränkungen gibt, was Sie tun können, wenn Sie den Wert festlegen. Zum Beispiel sind dies perfekte Beispiele für das, was Sie tun können:
const int a = 10;
const float b = a * 2.5f;
const string s1 = "Hello, world!";
const string s2 = s1 + " How are you?";
Auf der anderen Seite können Sie das Ergebnis eines Methodenaufrufs oder eines nicht konstanten Klassenelements nicht verwenden, da dies keine konstanten Ausdrücke sind. Hier ein paar Beispiele, was Sie NICHT tun können:
// NOT possible:
const int a = Math.Cos(4) * 2;
// Possible:
const string s1 = "Hello, world!";
// NOT possible:
const string s2 = s1.Substring(0, 6) + " Universe";
Der Unterschied liegt in dem, was der Compiler erwarten kann, wenn er Ihren Code erreicht, z.B.: Zahlen, Strings und andere Konstanten, im Gegensatz zu dem, was ausgeführt werden muss, um den Wert zu erhalten.
Eine konstante Alternative: Das schreibgeschützte Feld
Wenn Sie nach einer etwas weniger restriktiven Version einer Klassenkonstante suchen, sollten Sie sich das Schlüsselwort readonly ansehen. Es ist nicht auf Methodenebene verfügbar, aber es kann auf Klassenebene verwendet werden, um ein Feld zu definieren, das nur während der Deklaration oder der Ausführung der Konstruktormethode der Klasse geändert werden kann. Sobald das Objekt verfügbar ist, hat das Feld readonly für immer den gleichen Wert und kann vom Benutzer nicht geändert werden. Lass es uns ausprobieren:
class SomeClass
{
private readonly DateTime rightNow;
public readonly DateTime later = DateTime.Now.AddHours(2);
public SomeClass()
{
this.rightNow = DateTime.Now;
}
}
Also, wir haben zwei readonly Felder: Das erste ist privat, das zweite ist öffentlich (wir haben normalerweise Eigenschaften dafür, aber das lassen wir jetzt mal). Die erste wird ohne einen Wert deklariert (das können wir mit schreibgeschützten Feldern tun, im Gegensatz zu Konstanten), während die andere sofort initialisiert wird. Sie werden außerdem feststellen, dass wir die DateTime-Klasse als Datentyp verwenden und diesem einen nicht konstanten Wert zuweisen. Mit anderen Worten, wir machen eine Menge Dinge, die wir mit Konstanten nicht tun können, und machen schreibgeschützte Felder zu einer netten Alternative zu Konstanten.
Beachten Sie, wie ich dem Feld rightNow im Konstruktor der SomeClass-Klasse einen Wert zuweise. Wie bereits erwähnt, ist dies die letzte Möglichkeit, einem schreibgeschützten Feld einen Wert zuzuweisen. Unabhängig davon, ob Sie sich in einer Methode innerhalb der definierenden Klasse oder außerhalb befinden, erhalten Sie einen Kompilierungsfehler, wenn Sie versuchen, einem schreibgeschützten Feld einen Wert zuzuweisen.
Zusammenfassung
Eine Konstante kann entweder im Rahmen einer Methode oder auf Klassenebene definiert werden. Sie können einen Wert definieren, der bereits zur Kompilierzeit bekannt ist und später nicht mehr geändert werden kann. Typische Typen für Konstanten sind Integer, Floats, Strings und Booleans. Wenn Sie nach mehr Flexibilität suchen, versuchen Sie das schreibgeschützte Feld, wie oben beschrieben.