Welche Vorteile hat es, wenn eine Mitgliedsvariable als schreibgeschützt deklariert ist? Schützt sie nur davor, dass jemand ihren Wert während des Lebenszyklus der Klasse ändert, oder führt die Verwendung dieses Schlüsselworts zu einer Geschwindigkeits- oder Effizienzsteigerung?
Antworten
Zu viele Anzeigen?Vergessen Sie nicht, dass es einen Workaround gibt, um die readonly
Felder, die außerhalb von Konstruktoren mit out
params.
Ein bisschen unordentlich, aber:
private readonly int _someNumber;
private readonly string _someText;
public MyClass(int someNumber) : this(data, null)
{ }
public MyClass(int someNumber, string someText)
{
Initialise(out _someNumber, someNumber, out _someText, someText);
}
private void Initialise(out int _someNumber, int someNumber, out string _someText, string someText)
{
//some logic
}
Weitere Diskussion hier: http://www.adamjamesnaylor.com/2013/01/23/Setting-Readonly-Fields-From-Chained-Constructors.aspx
Hinzufügen eines grundlegenden Aspekts zur Beantwortung dieser Frage:
Eigenschaften können als schreibgeschützt ausgedrückt werden, indem man das set
Betreiber. In den meisten Fällen müssen Sie also nicht die readonly
Schlüsselwort zu Eigenschaften:
public int Foo { get; } // a readonly property
Im Gegensatz dazu: Felder brauchen die readonly
Schlüsselwort, um einen ähnlichen Effekt zu erzielen:
public readonly int Foo; // a readonly field
Ein Vorteil der Markierung eines Feldes als readonly
sein kann, um ein ähnliches Schreibschutzniveau zu erreichen wie eine Immobilie ohne set
Operator - ohne dass das Feld in eine Eigenschaft umgewandelt werden muss, falls dies aus irgendeinem Grund gewünscht wird.
Seien Sie vorsichtig mit privaten schreibgeschützten Arrays. Wenn diese einem Client als Objekt zur Verfügung gestellt werden (Sie könnten dies für COM-Interop tun, wie ich es tat), kann der Client Array-Werte manipulieren. Verwenden Sie die Methode Clone(), wenn Sie ein Array als Objekt zurückgeben.