29 Stimmen

Was ist der Unterschied zwischen Const und Static in C#?

Ich möchte gerne den Unterschied zwischen einer konstanten und einer statischen Variablen kennen.

Soweit ich weiß, ist ein const auch statisch und kann nicht auf Instanzvariable zugegriffen werden, die gleich wie statisch ist, was ist dann der Unterschied zwischen ihnen?

Bitte erklären Sie ...

39voto

Aaronaught Punkte 118136

const Felder können nur Wertarten enthalten oder System.String . Sie müssen unveränderlich und zur Kompilierzeit auflösbar sein.

static readonly Felder können und werden in der Regel Referenztypen enthalten, die (mit Ausnahme von Zeichenketten) nur zur Laufzeit erstellt werden können. Diese können (sollten aber nicht) veränderbare Typen sein; das Einzige, was sich nicht ändern kann, ist die Referenz selbst.

Wenn Sie eine "konstante" Menge von Instanzen pflegen müssen, die Referenztypen sind, tun Sie dies im Allgemeinen mit einer Menge von public static readonly Felder, wie zum Beispiel die Mitglieder von System.Drawing.SystemColors .

Nicht zuletzt ist die Initialisierung einer readonly Feld kann bis zur Ausführung eines Konstruktors aufgeschoben werden, was bedeutet, dass es, obwohl es nur geschrieben an einmal initialisiert wurde, muss sie nicht immer mit demselben Wert initialisiert werden. Echte Konstanten, die mit const kann immer nur einen einzigen Wert haben (der zur Kompilierzeit festgelegt wird).

15voto

itowlson Punkte 72130

Ein subtiler, aber entscheidender Unterschied ist, dass consts werden zur Kompilierzeit ausgewertet, während statics werden zur Laufzeit ausgewertet. Dies hat erhebliche Auswirkungen auf die Versionierung. Nehmen wir zum Beispiel an, Sie schreiben:

public const int MaxValue = 100;

Sie kompilieren und versenden Ihre Baugruppe (Baugruppe A). Dann schreibt jemand anderes eine Baugruppe (Baugruppe B), die auf MaxValue verweist. In diesem Fall wird der Wert 100 sowohl in ihrer als auch in Ihrer Assembly kompiliert.

Wenn Sie das geschrieben hätten:

public static readonly int MaxValue = 100;

dann bliebe der Verweis in ihrer Baugruppe genau das: ein Verweis. Wenn jemand Baugruppe B ausführt, wird der Wert 100 aus su Baugruppe, Baugruppe A.

Dies kann zum Beispiel einfache Parcheando-Szenarien betreffen. Wenn Sie eine aktualisierte Baugruppe A herausgeben, in der MaxValues als 200 deklariert ist, und der Benutzer diese Version über die vorherige Version kopiert (aber Baugruppe B nicht neu kompiliert), dann wird im ersten Szenario Baugruppe B weiterhin so arbeiten, als ob MaxValues 100 wäre, weil das die const Wert, der in die Baugruppe B kompiliert wurde. Im zweiten Szenario übernimmt die Baugruppe B den neuen Wert, weil sie die nicht-konstante static Variable zur Laufzeit.

6voto

Joel Coehoorn Punkte 377088

Wie Sie sagen, sind sowohl static als auch const an eine Typ und nicht eine Instanz eines Typs. Sie können jedoch statische Elemente weiterhin ändern. Const-Elemente können Sie nicht ändern.

Seien Sie jedoch vorsichtig damit. Wenn Ihr const-Element ein Referenztyp ist, muss der zugewiesene Ausdruck zur Kompilierzeit ausgewertet werden, und das bedeutet, dass der einzig mögliche Wert, den Sie der Referenz geben können, null (mit der bemerkenswerten und nützlichen Ausnahme von Zeichenketten).

3voto

Thomas Punkte 62314

Eine (nicht schreibgeschützte) statische Variable kann nach ihrer Deklaration geändert werden, eine Konstante hingegen nicht. Außerdem kann eine Konstante nicht über eine Funktion gesetzt werden, eine statische Variable hingegen schon.

0voto

anwar Punkte 1

Eine Konstante ist eine Variable, die in ihrem Wert nicht verändert werden kann.

Eine statische Variable ist eine Variable, die nicht außerhalb des Bereichs ihrer Deklaration verwendet werden kann. Das heißt, wenn es sich um eine globale Variable handelt, kann sie nur in der Datei verwendet werden, in der sie deklariert wurde. Handelt es sich um eine Variable innerhalb einer Funktion, so kann sie nur innerhalb dieser Funktion verwendet werden.

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