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.

3voto

Guney Ozsan Punkte 254

Verwenden Sie const, wenn Sie einen Kompilierungszeitkonstanten angeben können:

private const int Total = 5;

Verwenden Sie static readonly, wenn der Wert zur Laufzeit ausgewertet werden muss:

private static readonly int GripKey = Animator.StringToHash("Grip");

Dies führt zu einem Kompilierfehler, da es unmöglich ist, den Wert zur Kompilierungszeit zu erhalten.

private const int GripKey = Animator.StringToHash("Grip");

2voto

Boris Lipschitz Punkte 8746

Ein weiterer Unterschied zwischen der Deklaration von const und static readonly liegt in der Speicherzuweisung.

Ein statisches Feld gehört zum Typ eines Objekts, anstatt zu einer Instanz dieses Typs. Daher würde einmal das Klassenfeld aufgerufen, das statische Feld im Speicher für den Rest der Zeit "leben" und die gleiche Instanz des statischen Feldes würde von allen Instanzen des Typs referenziert werden.

Andererseits "gehört ein const Feld zu einer Instanz des Typs.

Wenn die Speicherfreigabe wichtiger für Sie ist, verwenden Sie const. Wenn Geschwindigkeit wichtiger ist, verwenden Sie static readonly.

2voto

Pavlo Somko Punkte 3

Const, readonly, static readonly - Schlüsselwörter, die eine ähnliche Aktion ausführen, aber einen wichtigen Unterschied haben:

Const - ist eine Variable, deren Wert konstant ist und zur Kompilierungszeit zugewiesen wird. Sie müssen ihm einen Wert zuweisen. Die Standardkonstanten sind statisch, und wir können den Wert der const-Variablen im gesamten Programm nicht ändern.

Readonly - bedeutet einen Wert, den wir zur Laufzeit ändern können, oder wir können ihn zur Laufzeit zuweisen, aber nur über einen nicht statischen Konstruktor.

Static readonly - Werte können zur Laufzeit zugewiesen oder zur Kompilierungszeit zugewiesen 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. Er kann nur einmal während der Ausführung geändert werden.

Beispiele finden Sie hier - https://www.c-sharpcorner.com/UploadFile/c210df/difference-between-const-readonly-and-static-readonly-in-C-Sharp/

1voto

Konstanten sind, wie der Name sagt, Felder, die nicht verändert werden und normalerweise statisch zur Kompilierzeit im Code definiert sind.

Schreibgeschützte Variablen sind Felder, die unter bestimmten Bedingungen verändert werden können.

Sie können entweder initialisiert werden, wenn Sie sie zum ersten Mal deklarieren, wie eine Konstante, aber normalerweise werden sie während der Objekterstellung im Konstruktor initialisiert.

Sie können nach der Initialisierung nicht mehr verändert werden, in den oben genannten Bedingungen.

Statische schreibgeschützte Variablen klingen für mich nach einer schlechten Wahl, denn wenn sie statisch sind und sich nie ändern, verwenden Sie einfach public const. Wenn sie sich ändern können, sind sie keine Konstante, und je nach Ihren Bedürfnissen können Sie entweder schreibgeschützt oder einfach eine normale Variable verwenden.

Eine weitere wichtige Unterscheidung ist auch, dass eine Konstante zur Klasse gehört, während die schreibgeschützte Variable zur Instanz gehört!

0voto

UberFace Punkte 425

Es gibt eine wichtige Frage, die in den obigen Antworten nirgends erwähnt wird und die Sie dazu bringen sollte, "const" vor allem für Grundtypen wie "int", "string" usw. zu bevorzugen.

Konstanten können als Attributparameter verwendet werden, statische readonly-Felder hingegen nicht!

Azure Functions HttpTrigger, Verwendung der HttpMethods-Klasse nicht im Attribut

Wenn Microsoft nur Konstanten für die HTTP-Methoden GET, POST, DELETE usw. verwendet hätte.

Es wäre möglich, zu schreiben

[HttpTrigger(AuthorizationLeve.Anonymous,  HttpMethods.Get)] // KOMPILEFEHLER: static readonly, 

Stattdessen muss ich auf

[HttpTrigger(AuthorizationLeve.Anonymous,  "GET")] // STRING

oder auf meine eigene Konstante zurückgreifen:

public class HttpConstants
{
    public const string Get = "GET";
}

[HttpTrigger(AuthorizationLeve.Anonymous,  HttpConstants.Get)] // Kompilieren OK!

0 Stimmen

Nicht sicher, ob ich dies besonders wichtig nennen würde. Und für das gegebene Beispiel würde ich einfach "GET" schreiben, da es viel kürzer ist und sowieso nicht etwas ist, das sich ändern wird.

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