1716 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?

9voto

Ryan Efendy Punkte 3323
  • wann zu verwenden const o readonly

    • const

      • Kompilierzeit konstant: absolut Konstante, Wert wird bei der Deklaration gesetzt, steht im IL-Code selbst
    • readonly

      • Laufzeit Konstante: kann im Konstruktor/init über die Konfigurationsdatei gesetzt werden, z. B. App.config aber wenn sie einmal initialisiert ist, kann sie nicht mehr geändert werden.

8voto

Muhammad VP Punkte 87

CONST

  1. Das Schlüsselwort const kann auf Felder oder lokale Variablen angewendet werden.
  2. Wir müssen das Feld const bei der Deklaration zuweisen
  3. Es wird kein Speicher zugewiesen, da der Konstantenwert nach der Kompilierung in den IL-Code selbst eingebettet wird. Es ist wie alle Vorkommen von const-Variable zu finden und durch ihren Wert zu ersetzen. So wird der IL-Code nach der Kompilierung hart kodierte Werte anstelle von const-Variablen haben
  4. Const in C# sind standardmäßig statisch.
  5. Der Wert ist für alle Objekte konstant
  6. Es gibt ein Problem mit der Versionierung von DLLs - Das bedeutet, dass jedes Mal, wenn wir eine öffentliche Konstantenvariable oder -eigenschaft ändern (theoretisch sollte sie nicht geändert werden), jede andere DLL oder Assembly, die diese Variable verwendet, neu erstellt werden muss.
  7. Nur eingebaute C#-Typen können als Konstante deklariert werden
  8. Const-Feld kann nicht als Ref- oder Out-Parameter übergeben werden

Schreibgeschützt

  1. das Schlüsselwort readonly gilt nur für Felder, nicht für lokale Variablen
  2. Wir können ein schreibgeschütztes Feld zum Zeitpunkt der Deklaration oder im Konstruktor zuweisen, nicht in anderen Methoden.
  3. dynamischer Speicher für schreibgeschützte Felder zugewiesen und wir können den Wert zur Laufzeit abrufen.
  4. Readonly gehört zu dem erstellten Objekt, so dass der Zugriff nur über die Instanz der Klasse erfolgt. Um es zum Klassenmitglied zu machen, müssen wir das Schlüsselwort static vor readonly hinzufügen.
  5. Der Wert kann je nach verwendetem Konstruktor unterschiedlich sein (da er zum Objekt der Klasse gehört)
  6. Wenn Sie einen nicht-primitiven Typ (Referenztyp) als schreibgeschützt deklarieren, ist nur die Referenz unveränderlich, nicht das Objekt, das sie enthält.
  7. Da der Wert zur Laufzeit ermittelt wird, gibt es bei schreibgeschützten Feldern/Eigenschaften kein Problem mit der DLL-Versionierung.
  8. Wir können Readonly-Felder als Ref- oder Out-Parameter im Konstruktorkontext übergeben.

6voto

Wedge Punkte 19070

Mit const gekennzeichnete Variablen sind kaum mehr als stark typisierte #define-Makros, zur Kompilierzeit werden const-Variablenreferenzen durch Inline-Literalwerte ersetzt. Infolgedessen können nur bestimmte eingebaute primitive Wertetypen auf diese Weise verwendet werden. Variablen, die als schreibgeschützt gekennzeichnet sind, können in einem Konstruktor zur Laufzeit gesetzt werden, und ihre Schreibgeschütztheit wird auch zur Laufzeit erzwungen. Dies ist mit geringfügigen Leistungseinbußen verbunden, aber es bedeutet, dass Sie readonly mit jedem Typ (sogar Referenztypen) verwenden können.

Außerdem sind const-Variablen von Natur aus statisch, während readonly-Variablen auf Wunsch instanzspezifisch sein können.

5voto

Chirag Punkte 3808

Es gibt einen bemerkenswerten Unterschied zwischen const und readonly Felder in C#.Net

const ist standardmäßig statisch und muss mit einem konstanten Wert initialisiert werden, der später nicht mehr geändert werden kann. Die Änderung des Wertes ist auch in Konstruktoren nicht erlaubt. 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 readonly string Name = string.Empty; //No error, legal

readonly kann als statisch deklariert werden, muss aber nicht. Bei der Deklaration muss nicht initialisiert werden. Sein Wert kann mit dem Konstruktor zugewiesen oder geändert werden. Daher bietet es einen Vorteil, wenn es als Instanzklassenmitglied verwendet wird. Zwei verschiedene Instanziierungen können unterschiedliche Werte für das Readonly-Feld haben. Zum Beispiel.

class A
{
    public readonly int Id;

    public A(int i)
    {
        Id = i;
    }
}

Dann kann ein schreibgeschütztes Feld mit augenblicksspezifischen Werten initialisiert werden, wie folgt:

A objOne = new A(5);
A objTwo = new A(10);

Hier hat die Instanz objOne den Wert des Feldes readonly 5 und objTwo den Wert 10. Was mit const nicht möglich ist.

3voto

Mark T Punkte 3374

Eine weitere Ich hab's kapiert .

Da const wirklich nur mit grundlegenden Datentypen funktioniert, können Sie sich, wenn Sie mit einer Klasse arbeiten wollen, "gezwungen" fühlen, ReadOnly zu verwenden. Doch Vorsicht, die Falle lauert! ReadOnly bedeutet, dass Sie das Objekt nicht durch ein anderes Objekt ersetzen können (Sie können es nicht auf ein anderes Objekt verweisen lassen). Aber jeder Prozess, der einen Verweis auf das Objekt hat, kann die Werte ändern innerhalb das Objekt!

Lassen Sie sich also nicht zu der Annahme verleiten, dass "ReadOnly" bedeutet, dass ein Benutzer keine Änderungen vornehmen kann. Es gibt keine einfache Syntax in C#, um zu verhindern, dass eine Instanziierung einer Klasse ihre internen Werte ändert (soweit ich weiß).

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