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?

21voto

Yeasin Abedin Punkte 1609

Nur lesen : Der Wert kann durch Ctor zur Laufzeit geändert werden. Aber nicht durch Member Function

Konstante : Standardmäßig statisch. Der Wert kann nirgendwo geändert werden (Ctor, Funktion, Laufzeit usw.)

14voto

Greg Punkte 22509

Ein weiteres Problem: Readonly-Werte können durch "hinterhältigen" Code über Reflection geändert werden.

var fi = this.GetType()
             .BaseType
             .GetField("_someField", 
                       BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, 1);

Kann ich ein privates geerbtes Nur-Lese-Feld in C# mit Reflexion ändern?

12voto

Daren Thomas Punkte 64742

Ich glaube, ein const Wert für alle Objekte gleich ist (und mit einem literalen Ausdruck initialisiert werden muss), während readonly kann bei jeder Instanziierung anders sein...

9voto

Scott Lawrence Punkte 6695

Eines der Teammitglieder in unserem Büro hat die folgenden Hinweise zur Verwendung von const, static und readonly gegeben:

  • Verwenden Sie const wenn Sie eine Variable eines Typs haben, den Sie zur Laufzeit kennen (string literal, int, double, enums,...), auf die alle Instanzen oder Konsumenten einer Klasse Zugriff haben sollen und deren Wert sich nicht ändern darf.
  • Verwenden Sie statisch wenn Sie Daten haben, auf die alle Instanzen oder Konsumenten einer Klasse Zugriff haben sollen und sich der Wert ändern kann.
  • Verwenden Sie statisch schreibgeschützt wenn Sie eine Variable eines Typs haben, den Sie zur Laufzeit nicht kennen können (Objekte), auf die alle Instanzen oder Konsumenten einer Klasse Zugriff haben sollen und deren Wert sich nicht ändern darf.
  • Verwenden Sie readonly Wenn Sie eine Variable auf Instanzebene haben, wissen Sie zum Zeitpunkt der Objekterstellung, dass sie sich nicht ändern sollte.

Ein letzter Hinweis: Ein const-Feld ist statisch, aber das Gegenteil ist nicht der Fall.

9voto

Hallgrim Punkte 14653

Sie sind beide konstant, aber eine const ist auch zur Kompilierzeit verfügbar. Dies bedeutet, dass ein Aspekt des Unterschieds darin besteht, dass Sie const-Variablen als Eingabe für Attributkonstruktoren verwenden können, nicht aber readonly-Variablen.

Exemple :

public static class Text {
  public const string ConstDescription = "This can be used.";
  public readonly static string ReadonlyDescription = "Cannot be used.";
}

public class Foo 
{
  [Description(Text.ConstDescription)]
  public int BarThatBuilds {
    { get; set; }
  }

  [Description(Text.ReadOnlyDescription)]
  public int BarThatDoesNotBuild {
    { get; set; }
  }
}

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