Statisch schreibgeschützt vs const

1386

Ich habe darüber gelesen const und static readonlyFelder . Wir haben einige Klassen, die nur konstante Werte enthalten. Wird für verschiedene Dinge in unserem System verwendet. Ich frage mich also, ob meine Beobachtung richtig ist:

Sollte diese Art von konstanten Werten immer sein static readonly für alles gelten, was öffentlich ist? Und nur constfür interne / geschützte / private Werte verwenden?

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

Svish
quelle
5
Hier ist ein sehr interessanter Einzelfall, für den ich mich gerade entschieden habe static readonly: Versuchen Sie, eine Konstante in einer zu verwenden, IEnumeratordie ein Unrecheable auslösen würde,yield und Sie erhalten einen gefürchteten "internen Compilerfehler" . Ich habe den Code außerhalb von Unity3D nicht getestet, aber ich vertraue darauf, dass dies entweder ein Mono- oder ein .NET- Fehler ist . Es ist dennoch ein C # -Problem.
Cregox
8
Ein weiterer Unterschied ist, dass Sie eine konstante Zeichenfolge in einem Schalter verwenden können, aber keine statische schreibgeschützte Zeichenfolge
flagg19
7
static readonlykann in der switch-caseAnweisung nicht als caseVariable verwendet werden, constist für diesen Zweck erforderlich.
Mostafiz Rahman
3
static readonlykann auch nicht als Attributparameter verwendet werden
Dread Boy

Antworten:

940

public static readonlyFelder sind etwas ungewöhnlich; public staticEigenschaften (mit nur a get) wären häufiger (möglicherweise durch ein private static readonlyFeld unterstützt).

constWerte werden direkt in die Anrufstelle gebrannt; das ist zweischneidig:

  • Es ist nutzlos, wenn der Wert zur Laufzeit abgerufen wird, möglicherweise aus der Konfiguration
  • Wenn Sie den Wert einer Konstante ändern, müssen Sie alle Clients neu erstellen
  • aber es kann schneller sein, da es einen Methodenaufruf vermeidet ...
  • ... was manchmal sowieso von der GEG eingefügt worden sein könnte

Wenn sich der Wert nie ändert, ist const in Ordnung - Zerousw. machen Sie vernünftige consts; p Ansonsten sind staticEigenschaften häufiger.

Marc Gravell
quelle
13
Warum eine Immobilie über einem Feld? Wenn es eine unveränderliche Klasse ist, sehe ich keinen Unterschied.
Michael Hedgpeth
73
@ Michael - gleiche Gründe wie immer; es verbirgt die Implementierung. Möglicherweise müssen Sie (später) faul geladen, konfigurationsbasiert, eine Fassade oder was auch immer sein. In Wirklichkeit wäre
beides
42
@CoffeeAddict Per Definition zieht eine Konstante keine Werte aus einer Konfigurationsdatei. Es wird zur Kompilierungszeit als Literal eingebrannt. Die einzige Möglichkeit, eine Konstante zur Laufzeit zu verwenden, besteht in der Reflexion über die Felder. Zu jeder anderen Zeit Sie versuchen , es zu benutzen, die Compiler wie bereits Ihre substituierte konstante Nutzung für wörtliche Nutzung; Wenn eine Methode in Ihrem Code 6 Konstanten verwendet und Sie sie als IL untersuchen, werden keine konstanten Suchvorgänge erwähnt. Die
Literalwerte
37
@MarcGravell - VORSICHT: readonlyFelder können nicht in switch / case-Anweisungen verwendet werden, sondern müssen vorhanden sein const.
Luciano
7
@didibus Durch das Ändern eines Felds in eine Eigenschaft wird die API tatsächlich beschädigt. Ein Feld in C # verhält sich effektiv wie eine Variable, während eine Eigenschaft in C # ein Syntaxhelfer zum Schreiben einer Getter-Methode und / oder einer Setter-Methode ist. Dieser Unterschied ist wichtig, wenn andere Baugruppen beteiligt sind. Wenn Sie ein Feld in eine Eigenschaft ändern und andere Assemblys von diesem Feld abhängen, müssen diese anderen Assemblys neu kompiliert werden.
Stephen Booher
237

Ich würde verwenden, static readonlywenn sich der Verbraucher in einer anderen Baugruppe befindet. Das constund den Verbraucher in zwei verschiedenen Baugruppen zu haben, ist eine gute Möglichkeit, sich in den Fuß zu schießen .

Michael Stum
quelle
5
Daher denke ich, wie einige erwähnt oder angedeutet haben, ist es möglicherweise ratsam, const nur für Werte zu verwenden, die tatsächlich bekannte Konstanten sind, wenn sie veröffentlicht werden, andernfalls sollten sie für den internen, geschützten oder privaten Zugriffsbereich reserviert werden.
Jpierson
1
@Dio Der Grund, warum es immer noch existiert, ist, dass es an sich kein Problem ist - es ist etwas, das man beachten muss, aber die Fähigkeit, Konstanten über Baugruppengrenzen hinweg zu inlineieren, ist eine gute Sache für die Leistung. Es geht wirklich nur darum, wirklich zu verstehen, dass "konstant" bedeutet "es wird sich nie ändern".
Michael Stum
1
@ MichaelStum Ok, ich sollte es nicht "ein Problem" nennen. In meiner Arbeit habe ich const und teile es für alle Assemblys, aber ich kompiliere es für jede Bereitstellung oder Codesendung neu. Trotzdem lohnt es sich auf jeden Fall, dies zur Kenntnis zu nehmen.
Dio Phung
1
Also im Allgemeinen internal constoder public static readonlyabhängig von der gewünschten Sichtbarkeit.
Iiridayn
2
@Iiridayn Ja, das ist keine schlechte Sichtweise. Es sind einige Randfälle zu berücksichtigen (z. B. wenn Reflection verwendet wird oder wenn ein Wert für ein Attribut benötigt wird), und es gibt gültige Verwendungen für public const(z. B. alles, was Teil eines Standards ist. Jedes Mal , wenn ich mit XML arbeite, gibt es einen Namespaces-Datei mit einer Reihe von public const string.) Im Allgemeinen public constsollte sie jedoch nur verwendet werden, nachdem die Auswirkungen richtig berücksichtigt wurden.
Michael Stum
200

Einige relevantere Dinge zu beachten:

const int a

  • muss initialisiert werden.
  • Die Initialisierung muss zur Kompilierungszeit erfolgen .

schreibgeschützt int a

  • kann einen Standardwert ohne Initialisierung verwenden.
  • Die Initialisierung kann zur Laufzeit erfolgen (Bearbeiten: nur innerhalb des Konstruktors).
Peter
quelle
39
innerhalb der ctoreinzigen.
Amit Kumar Ghosh
1
Nicht nur innerhalb des Konstruktors, sondern auch in der Deklaration ( docs.microsoft.com/en-us/dotnet/csharp/language-reference/… ).
DeChristo
176

Dies ist nur eine Ergänzung zu den anderen Antworten. Ich werde sie nicht wiederholen (jetzt vier Jahre später).

Es gibt Situationen, in denen a constund a non-const unterschiedliche Semantiken haben. Zum Beispiel:

const int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

druckt aus True, während:

static readonly int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

schreibt False.

Der Grund dafür ist, dass die Methode x.Equalszwei Überladungen aufweist, eine mit short( System.Int16) und eine mit object( System.Object). Nun ist die Frage, ob einer oder beide bei mir zutreffeny Argument .

Wenn yes sich um eine Konstante zur Kompilierungszeit (Literal) handelt, constwird es wichtig, dass eine implizite Konvertierung von int nach short vorhanden intist , vorausgesetzt, dass es sich um eine Konstante handelt, und dass der C # -Compiler überprüft, ob ihr Wert im Bereich von a short(liegt welches 42ist). Siehe Konvertierungen impliziter konstanter Ausdrücke in der C # -Sprachenspezifikation. Beide Überlastungen müssen also berücksichtigt werden. Die Überlastung Equals(short)wird bevorzugt (jede shortist eine object, aber nicht alle objectsind short). Wird yalso in konvertiert shortund diese Überlastung wird verwendet. Dann Equalsvergleicht zwei shortvon identischem Wert, und das ergibt true.

Wenn ykeine Konstante ist, existiert keine implizite Konvertierung von intnach short. Das liegt daran, dass ein im Allgemeinen intzu groß sein kann, um in ein zu passen short. (Es gibt eine explizite Konvertierung, aber ich habe nicht gesagt Equals((short)y), das ist also nicht relevant.) Wir sehen, dass nur eine Überladung gilt, die Equals(object)eine. Also yist verpackt object. Dann Equalswird eine vergleichen , System.Int16um ein System.Int32, und da die Laufzeittypen stimmen nicht einmal, das wird nachgebenfalse .

Wir schließen daraus, dass in einigen (seltenen) Fällen das Ändern eines constTypelements in ein static readonlyFeld (oder anders, wenn dies möglich ist) das Verhalten des Programms ändern kann.

Jeppe Stig Nielsen
quelle
17
Eine gute Ergänzung zur akzeptierten Antwort. Ich möchte hinzufügen, dass die ordnungsgemäße Konvertierung von Datentypen und anderen ähnlichen Richtlinien (wie Try Catches usw.) eine Grundvoraussetzung für erfahrene Programmierer sein sollte und nicht dem Compiler überlassen bleiben sollte. Trotzdem habe ich von hier etwas Neues gelernt. Vielen Dank.
Uknight
Wow, ich habe lange in C # programmiert und hätte nie gedacht, dass ein const int im Bereich eines Kurzschlusses implizit in einen Kurzschluss konvertiert werden könnte. Ich muss sagen, das ist ziemlich seltsam. Ich liebe C #, aber diese seltsamen Inkonsistenzen, die nicht viel Wert zu schaffen scheinen, aber eine Menge der erforderlichen Gehirnleistung hinzufügen, um ständig darüber nachzudenken, können besonders für Anfänger ärgerlich sein.
Mike Marynowski
@ MikeMarynowski Richtig. Aber ich denke, sie haben diese Regel (unter anderem) gemacht, um die Aussage short x = 42;legal zu machen . Denn dort haben Sie ein int, nämlich das Literal 42, das implizit in das verwandelt wird short x. Aber dann könnten sie dies auf nur numerische Literale beschränkt haben; Sie haben sich jedoch dafür entschieden, auch Dinge zuzulassen, wie short x = y;wo ydefiniert ist const int y = 42;, und dann haben sie dies erreicht.
Jeppe Stig Nielsen
88

Zu beachten ist, dass const auf primitive / Werttypen beschränkt ist (Ausnahme: Zeichenfolgen).

Chris S.
quelle
30
Eigentlich constkönnte es auch für andere Typen verwendet werden, außer dass es auf null initialisiert werden muss, was es nutzlos macht :)
nawfal
6
Ausnahme wie in System.Exception? :)
Memet Olsen
4
@nawfal Genauer gesagt, sind die einzigen Werttypen , für die constverwendet werden können, sind sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, sowie alle enumArten. constkann nicht für andere Werttypen wie DateTimeoder TimeSpanoder verwendet werden BigInteger. Es kann auch nicht für die IntPtrStruktur verwendet werden (von einigen als "primitiver" Typ angesehen; der Begriff primitiver Typ ist in C # verwirrend). ↵↵ Das constkann für alle Referenztypen verwendet werden . Wenn der Typ ist string, kann ein beliebiger Zeichenfolgenwert angegeben werden. Andernfalls muss der Wert sein null.
Jeppe Stig Nielsen
@JeppeStigNielsen - Ich hatte kürzlich einen Streit mit servy darüber - er wies darauf hin, dass Sie alles (Wert- und Referenztypen) constmit machen können default. Bei structTypen handelt es sich um eine Instanz, bei der alle Mitglieder auf die Standardwerte eingestellt sind.
Wai Ha Lee
28

Statisch schreibgeschützt : Der Wert kann staticzur Laufzeit über den Konstruktor geändert werden. Aber nicht durch die Mitgliedsfunktion.

Konstante : Standardmäßig static. Der Wert kann von keiner Stelle aus geändert werden (Ctor, Funktion, Laufzeit usw. nirgendwo).

Schreibgeschützt : Der Wert kann zur Laufzeit über den Konstruktor geändert werden. Aber nicht durch die Mitgliedsfunktion.

Sie können sich meine Repo: C # -Eigenschaftstypen ansehen .

Yeasin Abedin Siam
quelle
1
Schlechte Nachrichten ... defekter Link!
Fer R
Gute Schnipsel Siam ভাই :)
Muhammad Ashikuzzaman
25

Das readonlySchlüsselwort unterscheidet sich vom constSchlüsselwort. Ein constFeld kann nur bei der Deklaration des Feldes initialisiert werden. Ein readonlyFeld kann entweder bei der Deklaration oder in einem Konstruktor initialisiert werden. Daher können readonlyFelder je nach verwendetem Konstruktor unterschiedliche Werte haben. Während ein constFeld eine Konstante zur Kompilierungszeit ist, kann das readonlyFeld auch für Laufzeitkonstanten verwendet werden

Kurze und klare MSDN-Referenz hier

Yazanpro
quelle
16

constund readonlysind ähnlich, aber sie sind nicht genau gleich.

Ein constFeld ist eine Konstante zur Kompilierungszeit, dh dieser Wert kann zur Kompilierungszeit berechnet werden. Ein readonlyFeld ermöglicht zusätzliche Szenarien, in denen während der Erstellung des Typs Code ausgeführt werden muss. Nach dem Bau areadonly Feld nicht mehr geändert werden.

Beispielsweise können constMitglieder verwendet werden, um Mitglieder wie folgt zu definieren:

struct Test
{
    public const double Pi = 3.14;
    public const int Zero = 0;
}

Da Werte wie 3.14 und 0 Konstanten zur Kompilierungszeit sind. Betrachten Sie jedoch den Fall, in dem Sie einen Typ definieren und einige vorgefertigte Instanzen davon bereitstellen möchten. Beispielsweise möchten Sie möglicherweise eine Farbklasse definieren und "Konstanten" für gängige Farben wie Schwarz, Weiß usw. bereitstellen. Dies ist mit const-Elementen nicht möglich, da die rechten Seiten keine Konstanten zur Kompilierungszeit sind. Man könnte dies mit regulären statischen Mitgliedern tun:

public class Color
{
    public static Color Black = new Color(0, 0, 0);
    public static Color White = new Color(255, 255, 255);
    public static Color Red   = new Color(255, 0, 0);
    public static Color Green = new Color(0, 255, 0);
    public static Color Blue  = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}

Aber dann gibt es nichts, was einen Kunden von Color davon abhält, sich damit zu beschäftigen, vielleicht indem er die Schwarz-Weiß-Werte vertauscht. Dies würde natürlich andere Kunden der Color-Klasse bestürzen. Die Funktion "Nur Lesen" behebt dieses Szenario.

Durch einfaches Einfügen des readonlySchlüsselworts in die Deklarationen behalten wir die flexible Initialisierung bei und verhindern gleichzeitig, dass Client-Code durcheinander gerät.

public class Color
{
    public static readonly Color Black = new Color(0, 0, 0);
    public static readonly Color White = new Color(255, 255, 255);
    public static readonly Color Red   = new Color(255, 0, 0);
    public static readonly Color Green = new Color(0, 255, 0);
    public static readonly Color Blue  = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) => (red, green, blue) = (r, g, b);
}

Es ist interessant festzustellen, dass const-Elemente immer statisch sind, während ein schreibgeschütztes Element entweder statisch sein kann oder nicht, genau wie ein reguläres Feld.

Es ist möglich, ein einzelnes Schlüsselwort für diese beiden Zwecke zu verwenden, dies führt jedoch entweder zu Versionsproblemen oder zu Leistungsproblemen. Nehmen wir für einen Moment an, dass wir ein einziges Schlüsselwort für dieses (const) verwendet haben und ein Entwickler schrieb:

public class A
{
    public static const C = 0;
}

und ein anderer Entwickler schrieb Code, der sich auf A stützte:

public class B
{
    static void Main() => Console.WriteLine(A.C);
}

Kann der generierte Code nun auf der Tatsache beruhen, dass AC eine Konstante zur Kompilierungszeit ist? Kann die Verwendung von AC einfach durch den Wert 0 ersetzt werden? Wenn Sie dazu "Ja" sagen, bedeutet dies, dass der Entwickler von A die Art und Weise, wie AC initialisiert wird, nicht ändern kann - dies bindet die Hände des Entwicklers von A ohne Erlaubnis.

Wenn Sie zu dieser Frage "Nein" sagen, wird eine wichtige Optimierung übersehen. Vielleicht ist der Autor von A sicher, dass AC immer Null sein wird. Die Verwendung von const und readonly ermöglicht es dem Entwickler von A, die Absicht anzugeben. Dies sorgt für ein besseres Versionsverhalten und eine bessere Leistung.

Ramesh Rajendran
quelle
12

Ich bevorzuge es, const zu verwenden, wann immer ich kann, was, wie oben erwähnt, auf wörtliche Ausdrücke oder etwas beschränkt ist, das keine Bewertung erfordert.

Wenn ich auf diese Einschränkung stoße , greife ich mit einer Einschränkung auf statisch schreibgeschützt zurück . Ich würde im Allgemeinen eine öffentliche statische Eigenschaft mit einem Getter und einem privaten statischen schreibgeschützten Feld verwenden, wie Marc hier erwähnt .

Peter Meyer
quelle
7

Const: Const ist nichts anderes als "konstant", eine Variable, deren Wert konstant ist, jedoch zur Kompilierungszeit. Und es ist obligatorisch, ihm einen Wert zuzuweisen. Standardmäßig ist eine Konstante statisch und wir können den Wert einer Konstantenvariablen nicht im gesamten Programm ändern.

Static ReadOnly: Der Wert einer Variablen vom Typ Static Readonly kann 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. Sie kann zur Laufzeit nur einmal geändert werden

Referenz: c-Scharfe Ecke

Mayank
quelle
6

Ein statisches schreibgeschütztes Feld ist vorteilhaft, wenn Sie anderen Assemblys einen Wert zur Verfügung stellen, der sich in einer späteren Version möglicherweise ändert.

Angenommen, die Assembly Xstellt eine Konstante wie folgt bereit:

public const decimal ProgramVersion = 2.3;

Wenn Assembly auf diese Konstante Yverweist Xund diese verwendet, wird der Wert 2.3 Ybeim Kompilieren in Assembly gebacken . Dies bedeutet, dass, wenn Xspäter mit der auf 2.4 eingestellten Konstante neu kompiliert Ywird, der alte Wert von 2.3 bis Yzur Neukompilierung weiterhin verwendet wird. Ein statisches schreibgeschütztes Feld vermeidet dieses Problem.

Eine andere Sichtweise ist, dass jeder Wert, der sich in Zukunft ändern könnte, per Definition nicht konstant ist und daher nicht als einer dargestellt werden sollte.

Yagnesh Cangi
quelle
3

const:

  1. Wert sollte bei der Erklärung angegeben werden
  2. Zeitkonstante kompilieren

schreibgeschützt:

  1. Der Wert kann bei der Deklaration oder zur Laufzeit mithilfe von Konstruktoren angegeben werden. Der Wert kann je nach verwendetem Konstruktor variieren.
  2. Laufzeitkonstante
dasumohan89
quelle
3

Const : const Variablenwerte müssen zusammen mit der Deklaration definiert werden und danach ändert sie sich nicht mehr. const sind implizit statisch, sodass wir ohne Erstellen einer Klasseninstanz auf sie zugreifen können. Dies hat zum Zeitpunkt der Kompilierung einen Wert

Schreibgeschützt : Nur - Lese - Variablenwert können wir definieren , während als auch mit dem Konstruktor zur Laufzeit zu erklären. schreibgeschützte Variablen können ohne Klasseninstanz nicht zugreifen.

Statisch schreibgeschützt : statische schreibgeschützte Variablenwerte, die wir beim Deklarieren sowie nur über den statischen Konstruktor definieren können, jedoch nicht mit einem anderen Konstruktor. Auf diese Variablen können wir auch zugreifen, ohne eine Klasseninstanz zu erstellen (als statische Variablen).

Nur statisch schreibgeschützt ist die bessere Wahl, wenn wir die Variablen in verschiedenen Assemblys verwenden müssen. Bitte überprüfen Sie die vollständigen Details unter dem folgenden Link

https://www.stum.de/2009/01/14/const-strings-a-very-convenient-way-to-shoot-yourself-in-the-foot/

user1756922
quelle
Könnten Sie mir bitte sagen, warum Sie die Antwort abgelehnt haben, damit ich mich selbst und hier aktualisieren kann?
user1756922
Nicht der DV, aber es kann sein, dass diese Antwort den bereits umfassenden Antworten hier nicht wirklich etwas hinzufügt.
Marc L.
Denken Sie in der Tat daran, dass wir in Java Ende der 90er Jahre in einem Projekt mehrere Leute hatten, die verschiedene Jars mit Klassendateien produzierten, die zusammenarbeiteten (aufeinander verwiesen) und öffentliche const-Zeichenfolgen hatten Versionsprobleme, da sie kopiert wurden
George Birbilis
2

In C # .Net gibt es einen geringfügigen Unterschied zwischen const- und statischen schreibgeschützten Feldern

const muss zur Kompilierungszeit mit value initialisiert werden.

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

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public static readonly string Name = string.Empty; //No error, legal

readonly kann als statisch deklariert werden, ist aber nicht erforderlich. Zum Zeitpunkt der Deklaration ist keine Initialisierung erforderlich. Sein Wert kann einmal mit dem Konstruktor zugewiesen oder geändert werden. Es besteht also die Möglichkeit, den Wert des schreibgeschützten Feldes einmal zu ändern (spielt keine Rolle, ob es statisch ist oder nicht), was mit const nicht möglich ist.

Chirag
quelle
0

Konstanten sind wie der Name schon sagt, Felder, die sich nicht ändern und normalerweise zur Kompilierungszeit im Code statisch definiert werden.

Schreibgeschützte Variablen sind Felder, die sich unter bestimmten Bedingungen ändern können.

Sie können entweder initialisiert werden, wenn Sie sie zum ersten Mal als Konstante deklarieren. In der Regel werden sie jedoch während der Objektkonstruktion im Konstruktor initialisiert.

Sie können nach der Initialisierung unter den oben genannten Bedingungen nicht mehr geändert werden.

Statisch schreibgeschützt klingt für mich nach einer schlechten Wahl, denn wenn es statisch ist und sich nie ändert, verwenden Sie es einfach public const. Wenn es sich ändern kann, ist es keine Konstante. Abhängig von Ihren Anforderungen können Sie entweder read verwenden -nur oder nur eine reguläre Variable.

Ein weiterer wichtiger Unterschied ist, dass eine Konstante zur Klasse gehört, während die schreibgeschützte Variable zur Instanz gehört!

Claudiu Cojocaru
quelle
0

Eine Konstante (die zur Kompilierungszeit bestimmt wird) kann in Fällen verwendet werden, in denen eine schreibgeschützte Statik nicht möglich ist, wie in switch-Anweisungen oder Attributkonstruktoren. Dies liegt daran, dass schreibgeschützte Felder nur zur Laufzeit aufgelöst werden und einige Codekonstrukte eine Gewähr für die Kompilierungszeit erfordern. Eine schreibgeschützte Statik kann in einem Konstruktor berechnet werden, was häufig eine wesentliche und nützliche Sache ist. Der Unterschied ist funktional, wie ihre Verwendung meiner Meinung nach sein sollte.

In Bezug auf die Speicherzuweisung scheint es zumindest bei Zeichenfolgen (die ein Referenztyp sind) keinen Unterschied zu geben, dass beide intern sind und auf die eine internierte Instanz verweisen.

Persönlich ist meine Standardeinstellung schreibgeschützt, da sie für mich semantischer und logischer ist, zumal die meisten Werte zur Kompilierungszeit nicht benötigt werden. Übrigens ist die öffentliche Readonly-Statik nicht ungewöhnlich oder überhaupt nicht ungewöhnlich, wie in der markierten Antwort angegeben: Zum Beispiel System.String.Emptyeine.

DvS
quelle
0

Ein weiterer Unterschied zwischen der Deklaration von const und static readonly besteht in der Speicherzuordnung.

Ein statisches Feld gehört zum Typ eines Objekts als zu einer Instanz dieses Typs. Sobald die Klasse zum ersten Mal referenziert wird, "lebt" das statische Feld für den Rest der Zeit im Speicher, und dieselbe Instanz des statischen Felds wird von allen Instanzen des Typs referenziert.

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

Wenn die Speicherung der Freigabe für Sie wichtiger ist, verwenden Sie lieber const . Wenn Geschwindigkeit, dann statisch schreibgeschützt verwenden .

Boris Lipschitz
quelle