2010-08-03 17 views
21

Ich arbeite an einem Projekt mit ReSharper. Gelegentlich sagt es mir, dass ein Feld nur gelesen werden kann. Gibt es eine Leistung oder einen anderen Vorteil? Ich nehme an, die Vorteile wären ziemlich niedrig, oder wären irgendwelche Vorteile rein semantisch?Gibt es einen Vorteil, ein C# -Feld schreibgeschützt zu machen, wenn es angemessen ist?

Dank

Beispiel unter dem Feld war zunächst nur privat, sondern resharper aufgefordert, sie als Nur-Lese einzustellen. Ich verstehe den Grund, warum es als readonly gesetzt werden kann, dh. dessen wird im Konstruktor gesetzt und kann nicht mehr geändert, sondern nur fragen, ob es irgendwelche Vorteile zu dieser ...

public class MarketsController : Controller 
{ 
    private readonly IMarketsRepository marketsRepository; 

    public AnalysisController(IMarketsRepository marketsRepository) 
    {     
     this.marketsRepository = marketsRepository; 
    } 
} 

bearbeiten Was ist der einfachste Weg, auf dem MSIL suchen?

+0

bitte mit Code erklären. Es könnte leicht zu beantworten sein – anishMarokey

Antwort

23

Der Vorteil ist rein semantisch. Es wird den Benutzern Ihres Codes helfen zu verstehen, dass dieses Feld nicht geändert werden kann, nachdem das Objekt erstellt wurde. Der Compiler verhindert unerwünschte Änderungen dieses Feldes. Ich stimme dem folgenden Zitat aus Python Zen zu:

Explizit ist besser als implizit.

Einige Details:

Der einzige Unterschied zwischen normalen Feld und Nur-Lese-Feld-Flag initonly in IL. Es gibt keine Optimierung darüber (wie bei Konstanten), weil es eigentlich alle Operationen erlaubt (get und set, aber nur in ctor). Es ist nur Hinweis auf Compiler: Lassen Sie es nicht nach der Konstruktion geändert werden.

.field public initonly int32 R 
+5

+1: Explizit in Bezug auf Readonly-Felder hilft massiv beim Nachdenken über Multithread-Systeme. Wenn Sie einer Klasse ein Instanzfeld hinzufügen, sollten Sie überlegen, ob es sich ändern soll oder nicht. Wenn dies nicht der Fall ist, markieren Sie es als readonly - einfach so. In der Tat denke ich manchmal, dass es ein "veränderbares" Schlüsselwort geben sollte anstatt "nur lesen" (Nicken zu F # und seinen Elternsprachen). –

2

Das könnte Sie interessieren: this answer.

Das Nur-Lese-Schlüsselwort ist an einem Member-Variable einen konstanten erklären verwendet, sondern ermöglicht den Wert zur Laufzeit berechnet werden. Dies unterscheidet sich von einer Konstante, die mit dem Const Modifikator deklariert wurde, dessen Wert zur Kompilierzeit festgelegt werden muss. Mit readonly können Sie den Wert des Feldes entweder in der Deklaration oder in dem -Konstruktor des Objekts, das das -Feld ein Mitglied von ist, festlegen.

8

Es ist nicht so viel Low-Level-Leistung, aber mehr High-Level-Wartbarkeit. Dinge nur noch lesbar zu machen, ist eine der Möglichkeiten, die Anzahl der Orte zu begrenzen und zu kontrollieren, an denen ein bestimmter Wert geändert werden kann. Dies wiederum bedeutet, dass Sie die gegenseitige Abhängigkeit zwischen den Klassen verringern (a.k.a. "loose coupling"); Das Ergebnis ist eine Anwendung, die weniger interne Abhängigkeiten und damit eine geringere Komplexität aufweist. Mit anderen Worten, schreibgeschützte Felder und Eigenschaften machen Ihre Anwendung wartungsfreundlicher.

2

Es könnte auch helfen, einige Fehler zu erkennen. Der Wert wird nur in einem Konstruktor zugewiesen und dies könnte ein Problem sein, wenn Sie vergessen haben, woanders hin zu wechseln. Und wenn es nicht geändert werden soll, dann markieren Sie es als schreibgeschützt.

3

Meine Professorin hat mir damals beigebracht, dass das Erklären von etwas, das nur gelesen wird, eine Möglichkeit ist, deinem Computer zuzugeben, dass du Fehler machst.

+0

Debugging bedeutet, dass Sie einen Fehler gemacht haben. –

+1

"Immer versucht. Immer gescheitert. Egal. Versuchen Sie es erneut. Scheitern Sie noch einmal. Scheitern Sie besser" - so lernen wir und nichts, wofür wir uns schämen müssten. In diesem speziellen "readonly" Kontext würde ich mit Alex Humphrey gehen: es ist kein Fehler, es ist ein Fortschritt. – mbx