1687 Stimmen

Was ist der Unterschied zwischen const und readonly in C#?

Was ist der Unterschied zwischen const y readonly in C#?

Wann würden Sie das eine dem anderen vorziehen?

1540voto

Gishu Punkte 130442

Abgesehen von dem offensichtlichen Unterschied von

  • den Wert zum Zeitpunkt der Definition einer Definition für eine const VS readonly Werte können dynamisch berechnet werden, müssen aber zugewiesen werden, bevor der Konstruktor beendet wird. Danach wird er eingefroren.
  • const sind stillschweigend static . Sie verwenden eine ClassName.ConstantName Notation, um auf sie zuzugreifen.

Es gibt einen feinen Unterschied. Betrachten Sie eine Klasse, die in AssemblyA .

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly int I_RO_VALUE;
  public Const_V_Readonly()
  {
     I_RO_VALUE = 3;
  }
}

AssemblyB Referenzen AssemblyA und verwendet diese Werte im Code. Wenn dieser kompiliert wird:

  • im Falle der const Wert, ist es wie ein Suchen-Ersetzen. Der Wert 2 wird in die Datei AssemblyB 's IL. Das heißt, wenn ich morgen die I_CONST_VALUE bis 20, AssemblyB würde noch 2 haben, bis ich es neu kompiliere .
  • im Falle der readonly Wert, ist es wie ein ref auf einen Speicherplatz. Der Wert wird nicht in AssemblyB 's IL. Das bedeutet, dass, wenn der Speicherplatz aktualisiert wird, AssemblyB erhält den neuen Wert ohne Neukompilierung. Wenn also I_RO_VALUE auf 30 aktualisiert wird, müssen Sie nur noch die AssemblyA und alle Clients müssen nicht neu kompiliert werden.

Wenn Sie also sicher sind, dass sich der Wert der Konstante nicht ändern wird, verwenden Sie eine const .

public const int CM_IN_A_METER = 100;

Aber wenn Sie eine Konstante haben, die sich ändern kann (z.B. in Bezug auf die Genauigkeit), oder wenn Sie Zweifel haben, verwenden Sie eine readonly .

public readonly float PI = 3.14;

Update: Aku muss erwähnt werden, weil er zuerst darauf hingewiesen hat. Außerdem muss ich angeben, wo ich das gelernt habe: Effektives C# - Bill Wagner

328voto

aku Punkte 118808

Es gibt ein Problem mit Konstanten! Wenn Sie eine Konstante aus einer anderen Assembly referenzieren, wird ihr Wert direkt in die aufrufende Assembly kompiliert. Wenn Sie also die Konstante in der referenzierten Assembly aktualisieren, wird sie sich in der aufrufenden Assembly nicht ändern!

201voto

splattne Punkte 102178

Konstanten

  • Konstanten sind standardmäßig statisch
  • Sie müssen zur Kompilierungszeit einen Wert haben (Sie können z.B. 3.14 * 2 haben, aber keine Methoden aufrufen)
  • Kann innerhalb von Funktionen deklariert werden
  • werden in jede Assembly kopiert, die sie verwendet (jede Assembly erhält eine lokale Kopie der Werte)
  • Kann in Attributen verwendet werden

Nur-Lese-Instanzfelder

  • Muss bei Beendigung des Konstruktors einen Wert gesetzt haben
  • werden bei der Erstellung der Instanz ausgewertet

Statische schreibgeschützte Felder

  • werden ausgewertet, wenn die Codeausführung auf eine Klassenreferenz trifft (wenn eine neue Instanz erstellt oder eine statische Methode ausgeführt wird)
  • Muss einen ausgewerteten Wert haben, wenn der statische Konstruktor fertig ist
  • Es wird nicht empfohlen, diese mit ThreadStaticAttribute zu versehen (statische Konstruktoren werden nur in einem Thread ausgeführt und setzen den Wert für diesen Thread; für alle anderen Threads ist dieser Wert nicht initialisiert)

76voto

Ich möchte nur hinzufügen, readonly für Referenztypen macht nur die Referenz lesbar, nicht die Werte. Zum Beispiel:

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly char[] I_RO_VALUE = new Char[]{'a', 'b', 'c'};

  public UpdateReadonly()
  {
     I_RO_VALUE[0] = 'V'; //perfectly legal and will update the value
     I_RO_VALUE = new char[]{'V'}; //will cause compiler error
  }
}

52voto

Deepthi Punkte 441

const : Kann nirgends geändert werden.

readonly : Dieser Wert kann nur im Konstruktor geändert werden. Er kann nicht in normalen Funktionen geändert 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