2010-08-03 11 views
12

Ich habe bemerkt, Resharper Vorschlag unter "Common Practices und Code Verbesserungen": Convert lokale Variable oder Feld zu Konstante.Warum bevorzugt ReSharper Überlastungen nur readonly?

habe bemerkt, ich auch, dass in Bill Wagners Buch „Effective C#: 50 Specific Ways to Improve Your C#“ ein Langauge Idiom gibt „const Bevorzugen Nur-Lese-“ ist, in der consts Autor erklärt Risiken der Verwendung.

Meine Frage ist nicht über Unterschiede zwischen readonly und const und wann sie zu verwenden, aber warum die eine Quelle setzen const als eine allgemeine Praxis/Code-Verbesserung und auf der anderen Seite behandelt die zweite Readonly als ein Idiom?

+4

Lesen Sie sorgfältig: "Meine Frage ist nicht über Unterschiede zwischen readonly und const und wann sie zu verwenden" ... –

Antwort

9

Private Konstanten tragen nicht die gleichen Risiken wie öffentliche Konstanten. Resharper schlägt vermutlich Leistungsoptimierungen für Fälle vor, in denen ein Feld nicht von außen sichtbar ist.

+1

Dies ist der entscheidende Punkt hier. Bei privaten Konstanten gibt es keine Bedenken hinsichtlich der Wartbarkeit, da sie niemals direkt in externe Assemblies eingebaut werden können. –

2

Nach meiner Erfahrung mit Resharper erhalten Sie diesen Vorschlag, wenn Sie einen Variablenwert in der Deklaration festlegen, aber der Wert der Variablen ändert sich nie während der Methode. In diesem Fall kann es zu einer lokalen Konstante gemacht werden. Sie erhalten auch eine Warnung für eine Instanzvariable, die Sie initialisieren, aber ändern Sie den Wert nie irgendwo im Klassenkörper.

Und der Autor dieses Buches macht im Grunde das Argument, dass mit der Verwendung von readonly anstelle von const, Sie vermeiden können, abhängige Assemblies neu zu erstellen, wenn Sie den Wert des Werts readonly ändern. Im Gegensatz dazu müssten Sie für eine Änderung an const die abhängigen Assemblys gegen die neue Version der Assembly mit der const neu kompilieren.

Es ist ein legitimes Argument, aber wenn sich ein Wert während der gesamten Lebensdauer der Anwendung nicht ändert, denke ich immer noch, dass es besser ist, const zu verwenden. Ich verwende gerne readonly für Werte, die ich zB von einer Konfiguration lade, die sich nach der Initialisierung im Konstruktor nicht ändert.

Ich denke, es ist viel besser, die Code-Klarheit zu haben, die const bei den möglichen Kosten von etwas mehr Kompilierung Wartung zur Verfügung stellt.

+0

Es fragt mich sogar auf Readonly-Feld initialisieren. –

+0

Ja, wenn das schreibgeschützte Feld als Instanzvariable deklariert ist und Sie dessen Wert nirgendwo im Code ändern, erhalten Sie diese Warnung. Und ich stimme hier eher mit Resharper überein als mit Bill Waggoner, aus den Gründen, die ich in meinem Text erwähnt habe. Aber Wagoner macht gute Punkte, es ist nur eine Frage der Meinung. – dcp