1595 Stimmen

'Statisch schreibgeschützt' vs. 'const'

Ich habe mich über const und static readonly Felder informiert. Wir haben einige Klassen, die nur konstante Werte enthalten. Sie werden für verschiedene Dinge in unserem System verwendet. Daher frage ich mich, ob meine Beobachtung korrekt ist:

Sollten diese Art von konstanten Werten immer static readonly sein für alles, was öffentlich ist? Und nur const für internal/protected/private Werte verwenden?

Was empfehlen Sie? Sollte ich vielleicht sogar keine static readonly Felder verwenden, sondern vielleicht Eigenschaften?

8 Stimmen

Hier ist ein sehr interessanter Einzelfall, den ich gerade zugunsten von static readonly gefunden habe: Versuchen Sie, ein const innerhalb eines IEnumerator zu verwenden, das ein unerreichbares yield auslösen würde, und Sie erhalten einen gefürchteten "Interner Compilerfehler". Ich habe den Code nicht außerhalb von Unity3D getestet, aber ich vertraue darauf, dass dies entweder ein Mono oder ein .NET Fehler ist. Es handelt sich jedoch um ein C# Problem.

4 Stimmen

10 Stimmen

Eine weitere Unterschied besteht darin, dass Sie eine const-Zeichenfolge in einem Switch verwenden können, aber keine static readonly-Zeichenfolge.

11voto

Yagnesh Cangi Punkte 353

Ein statisches schreibgeschütztes Feld ist vorteilhaft, wenn einem anderen Assembly ein Wert zur Verfügung gestellt wird, der sich möglicherweise in einer späteren Version ändern könnte.

Zum Beispiel, nehmen wir an, die Assembly X stellt eine Konstante wie folgt zur Verfügung:

public const decimal ProgramVersion = 2.3;

Wenn die Assembly Y auf X verweist und diese Konstante verwendet, wird der Wert 2.3 in die Assembly Y eingebettet, wenn sie kompiliert wird. Das bedeutet, dass wenn X später neu kompiliert wird und die Konstante auf 2.4 gesetzt ist, wird Y weiterhin den alten Wert von 2.3 verwenden, bis Y neu kompiliert wird. Ein statisches schreibgeschütztes Feld vermeidet dieses Problem.

Eine andere Möglichkeit, dies zu betrachten, ist, dass ein Wert, der sich in Zukunft ändern könnte, per Definition nicht konstant ist und daher nicht als eine solche dargestellt werden sollte.

9voto

mayank Punkte 2465

Const: Const ist nichts anderes als "konstant", eine Variable, deren Wert konstant ist, aber zur Compile-Zeit festgelegt wird. Und es ist obligatorisch, ihm einen Wert zuzuweisen. Standardmäßig ist ein const statisch und wir können den Wert einer const-Variablen im gesamten Programm nicht ändern.

Static ReadOnly: Der Wert einer statischen schreibgeschützten Variablen kann zur Laufzeit zugewiesen oder zur Compile-Zeit festgelegt und zur Laufzeit geändert werden. Der Wert dieser Variablen kann jedoch nur im statischen Konstruktor geändert werden. Und kann nicht weiter geändert werden. Es kann nur einmal zur Laufzeit geändert werden

Referenz: c-sharpcorner

8voto

Chirag Punkte 3808

Es gibt einen geringfügigen Unterschied zwischen const- und static-readonly-Feldern in C#.Net

const muss zur Kompilierzeit mit einem Wert initialisiert werden.

const ist standardmäßig statisch und muss mit einem konstanten Wert initialisiert werden, der später nicht geändert werden kann. Es kann nicht mit allen Datentypen verwendet werden. Zum Beispiel DateTime. Es kann nicht mit dem DateTime-Datentyp verwendet werden.

public const DateTime dt = DateTime.Today;  // wirft einen Kompilierfehler
public const string Name = string.Empty;    // wirft einen Kompilierfehler
public static readonly string Name = string.Empty; //Kein Fehler, legal

readonly kann als statisch deklariert werden, ist aber nicht notwendig. Es muss nicht zum Zeitpunkt der Deklaration initialisiert werden. Der Wert kann einmal über den Konstruktor zugewiesen oder geändert werden. Es besteht also die Möglichkeit, den Wert eines readonly-Felds einmal zu ändern (unabhängig davon, ob es statisch ist oder nicht), was mit const nicht möglich ist.

5voto

dasumohan89 Punkte 73

Const:

  1. Der Wert muss bei der Deklaration angegeben werden
  2. Konstante zur Kompilierzeit

readonly:

  1. Der Wert kann bei der Deklaration oder zur Laufzeit mit Konstruktoren angegeben werden. Der Wert kann je nach verwendeten Konstruktor variieren.
  2. Konstante zur Laufzeit

0 Stimmen

Re "sollte gegeben werden": Meinst du "muss gegeben werden"? Gibt es einen Weg daran vorbei?

3voto

DvS Punkte 1008

Eine Konstante (die zur Kompilierzeit bestimmt wird) kann in Fällen verwendet werden, in denen ein schreibgeschütztes statisches Element nicht verwendet werden kann, wie z.B. in Switch-Anweisungen oder Attributkonstruktoren. Dies liegt daran, dass schreibgeschützte Felder nur zur Laufzeit aufgelöst werden und einige Codekonstrukte zur Kompilierzeit eine Sicherheitsgarantie erfordern. Ein schreibgeschütztes statisches Element kann in einem Konstruktor berechnet werden, was oft eine wesentliche und nützliche Sache ist. Der Unterschied ist funktional, wie meiner Meinung nach auch ihre Verwendung sein sollte.

In Bezug auf die Speicherzuweisung gibt es zumindest bei Zeichenfolgen (die einen Verweistyp darstellen) keinen Unterschied, da beide interniert sind und auf dieselbe internierte Instanz verweisen werden.

Persönlich bevorzuge ich standardmäßig schreibgeschützte statische Elemente, da es für mich semantisch und logisch sinnvoller ist, insbesondere da die meisten Werte nicht zur Kompilierzeit benötigt werden. Übrigens sind öffentliche schreibgeschützte statische Elemente nicht ungewöhnlich oder unüblich, wie die markierte Antwort besagt: Zum Beispiel ist System.String.Empty eines davon.

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