386 Stimmen

Welche Vorteile bietet die Kennzeichnung eines Feldes als "schreibgeschützt" in C#?

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?

11voto

Brian Rasmussen Punkte 112118

Beachten Sie, dass readonly nur für den Wert selbst gilt. Wenn Sie also einen Referenztyp verwenden, schützt readonly nur die Referenz vor Änderungen. Der Zustand der Instanz wird durch readonly nicht geschützt.

4voto

Neil Punkte 6947

Überraschenderweise kann readonly tatsächlich zu langsamerem Code führen, wie Jon Skeet beim Testen seiner Noda Time-Bibliothek feststellte. In diesem Fall benötigte ein Test, der in 20 Sekunden lief, nur 4 Sekunden, nachdem readonly entfernt wurde.

https://codeblog.jonskeet.uk/2014/07/16/micro-optimization-the-surprising-inefficiency-of-readonly-fields/

1voto

Adam Naylor Punkte 5964

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

1voto

code14214 Punkte 45

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.

0voto

Michael Punkte 27

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.

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