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.

0voto

Santosh Karanam Punkte 828

Const

  1. Kann nur für Felder angewendet werden. Wert muss zur Kompilierzeit des Codes festgelegt sein.
  2. Geeignet zum Entfernen von "magischen" Zeichenfolgen, "int/double" (primitiven Datentypen) usw. im gesamten Code, die bereits vor dem Kompilieren bekannt sind.
  3. Nach dem Kompilieren wird der Wert überall im kompilierten Code platziert, wo die Konstante verwendet wird. Wenn also eine lange Zeichenfolge an vielen Stellen verwendet wird, sollten Sie vorsichtig sein, bevor Sie sie als const deklarieren. Überlegen Sie stattdessen, static read only zu verwenden.

Static read only

  1. Static read only kann für Felder/Properties angewendet werden, und static kann für Methoden verwendet werden. (Auf einer Anmerkung) Wenn static auf Methoden angewendet wird, übergibt der kompilierte Code nicht den 'this'-Parameter an die Methode und Sie können daher nicht auf die Instanzdaten des Objekts zugreifen.
  2. Geeignet für Werte, die sich nach dem Kompilieren des Codes ändern können. Wie z.B. Werte, die aus der Konfiguration initialisiert werden, während der Anwendung des Anwendungsprogramms usw.
  3. Nach dem Kompilieren des Codes wird der Verweis auf den Wert im IL-Code verwendet und kann langsamer sein als die Verwendung von const, aber der kompilierte Code ist kleiner.

Während der Refaktorisierung können alle const sicher in static read only umgewandelt werden, aber nicht umgekehrt, wie oben gesehen, wenn umgewandelt wird der Code brechen kann, da einige static readonly Variablen in Konstruktoren initialisiert werden könnten.

0 Stimmen

Mein Verständnis von Zeichenfolgenkonstanten in C# ist, dass die Konstante selbst, auch wenn sie an mehreren Stellen verwendet wird, eine einzelne Zeichenfolge im Speicher ist. Eine große Zeichenfolge in einem const wäre also immer nur ein einzelner Wert, der an verschiedenen Stellen im Code referenziert wird, wie in dieser Antwort: stackoverflow.com/a/12004049/5087364. Die hier verwendete Formulierung: "Nach der Kompilierung wird der Wert überall im kompilierten Code platziert, wo die Konstante verwendet wird." lässt es so klingen, als würde mehr Speicher verwendet werden.

0 Stimmen

Ja, das ist korrekt. Der const-Wert ist kein Referenztyp. Er wird an jeder Stelle ersetzt, an der das const verwendet wird. Ich habe dies mit einem kleinen Programm hier überprüft und den Assemblercode für dich überprüft - github.com/santoshkaranam/constants

0voto

Mmm Punkte 373

Ein weiterer Unterschied, den ich oben nicht erwähnt habe:

const und static readonly Werte erhalten keine CodeLens in der Visual Studio IDE.

static get-Eigenschaften erhalten CodeLens.

Code Lens Beispiel

Ich halte die Zugabe von CodeLens für sehr wertvoll.

Hinweis: Verwende derzeit Visual Studio 2022.

0 Stimmen

Dies scheint eher zu einem Thread "Eigenschaft vs. Feld" zu gehören als zur aktuellen Frage "Static readonly vs. const". Und Eigenschaften haben auch andere Vorteile; Sie können die Logik unter dem get Accessor später komplizierter machen, ohne den "Vertrag" mit dem Verbraucher des Elements zu ändern.

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