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?

51voto

Vinko Vrsalovic Punkte 252104

Das erklärt es . Zusammenfassung: const muss bei der Deklaration initialisiert werden, readonly kann im Konstruktor initialisiert werden (und damit je nach verwendetem Konstruktor einen anderen Wert haben).

EDIT: Siehe Gishus obigen Hinweis auf den feinen Unterschied

42voto

Sujit Punkte 3507

Eine Konstante wird zur Kompilierzeit definiert und kann zur Laufzeit nicht geändert werden. Konstanten werden als Feld deklariert, indem die const Schlüsselwort und müssen bei ihrer Deklaration initialisiert werden.

public class MyClass
{
    public const double PI1 = 3.14159;
}

A readonly member ist wie eine Konstante, da es einen unveränderlichen Wert darstellt. Der Unterschied besteht darin, dass ein readonly Member können sowohl zur Laufzeit in einem Konstruktor initialisiert werden, als auch bei der Deklaration initialisiert werden.

public class MyClass1
{
     public readonly double PI2 = 3.14159;

     //or

     public readonly double PI3;

     public MyClass2()
     {
         PI3 = 3.14159;
     }
}

const

  • Sie können nicht deklariert werden als static (sie sind implizit statisch)
  • Der Wert der Konstante wird zur Kompilierzeit ausgewertet
  • Konstanten werden nur bei der Deklaration initialisiert

readonly

  • Sie können entweder auf Instanzebene oder statisch sein
  • Der Wert wird zur Laufzeit ausgewertet
  • readonly kann in der Deklaration oder durch Code im Konstruktor initialisiert werden

37voto

Mike Two Punkte 42868

Es gibt ein kleines Problem mit readonly. Ein readonly-Feld kann innerhalb des/der Konstruktoren mehrfach gesetzt werden. Selbst wenn der Wert in zwei verschiedenen verketteten Konstruktoren gesetzt wird, ist dies noch zulässig.

public class Sample {
    private readonly string ro;

    public Sample() {
        ro = "set";
    }

    public Sample(string value) : this() {
        ro = value; // this works even though it was set in the no-arg ctor
    }
}

34voto

Wheelie Punkte 3746

Eine const ist eine Konstante zur Kompilierzeit, während readonly es ermöglicht, einen Wert zur Laufzeit zu berechnen und im Konstruktor oder Feldinitialisierer zu setzen. Eine "const"-Konstante ist also immer konstant, während eine "readonly"-Konstante nur gelesen werden kann, sobald sie zugewiesen ist.

Eric Lippert aus dem C#-Team hat mehr Informationen über verschiedene Arten der Unveränderlichkeit.

22voto

Chris S Punkte 63542

Hier ist ein weiterer Link demonstriert, dass const nicht versionssicher oder für Referenztypen relevant ist.

Zusammenfassung :

  • Der Wert Ihrer const-Eigenschaft wird beim Kompilieren festgelegt und kann zur Laufzeit nicht geändert werden.
  • Const können nicht als statisch markiert werden - das Schlüsselwort bedeutet, dass sie statisch sind, im Gegensatz zu schreibgeschützten Feldern, die dies können.
  • Const kann nichts anderes sein als (primitive) Werttypen
  • Das Schlüsselwort readonly kennzeichnet das Feld als unveränderbar. Die Eigenschaft kann jedoch im Konstruktor der Klasse geändert werden
  • Das readonly only-Schlüsselwort kann auch mit static kombiniert werden, damit es sich wie ein const verhält (zumindest oberflächlich gesehen). Es gibt einen deutlichen Unterschied, wenn man sich die AWL zwischen den beiden ansieht
  • const-Felder sind in der AWL als "literal" gekennzeichnet, während readonly "initonly" ist.

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