22 Stimmen

Warum schlägt resharper die Verwendung von readonly in Feldern vor, die nicht geändert werden?

Um die Frage zu klären, möchte ich hinzufügen, dass ich nicht frage, warum ich readonly über const wählen sollte oder was die Vorteile von readonly über const sind.

Ich frage mich, warum man ein Feld schreibgeschützt machen sollte, nur weil es (derzeit) nicht geändert wird.

zum Beispiel: Wenn ich die folgende Klasse schreiben würde:

public class MyClass
{
      public int _i = 5;

      // Code that doesn't change the value of i:
      ...
}

Resharper zeigt an, dass die Datei schreibgeschützt werden kann.

Danke

29voto

tvanfosson Punkte 506878

Wenn es feststellt, dass Sie einer Variablen nur bei der Initialisierung etwas zuweisen, geht es davon aus, dass Sie nicht wollen, dass sich die Variable ändert. Wenn Sie die Variable als "readonly" (oder "const") kennzeichnen, können Sie ihr in Zukunft nichts mehr zuweisen. Da dies (durch die Verwendung) das von Ihnen gewünschte Verhalten zu sein scheint, wird vorgeschlagen, dass Sie es formalisieren und den Nutzen des Schutzes ableiten.

5voto

P Daddy Punkte 27687

Normalerweise versuche ich mich zu erinnern 1 um das zu tun, woran Resharper Sie erinnern will. Wenn ich Felder habe, die unveränderlich sind, markiere ich sie gerne mit readonly um das zu formalisieren. Bei vielen Typen mache ich das auf allen Feldern. Es gibt Vorteile der Unveränderlichkeit ( [2] [3] ), und Resharper versucht, Ihnen dabei zu helfen, diese zu nutzen.

<sup>1 </sup>Ich persönlich verwende Resharper nicht. Ich habe meine Gründe.

4voto

Saulius Valatka Punkte 6549

Nun, es ist ziemlich offensichtlich, dass eine Variable, die nie geändert wird, entweder const oder read-only sein sollte. Die Frage, was davon besser ist, hängt von der jeweiligen Situation ab. Const-Variablen sind per Definition konstant - ihre Werte sollten NIEMALS ändern (z.B. const int minutesInAnHour = 60; scheint ein guter Kandidat zu sein). Deshalb ist die Konstante implizit ein statisches Mitglied und wird während der Kompilierungszeit initialisiert, d.h. der Compiler könnte tatsächlich alle Erscheinungen Ihrer Konstante durch den literalen Wert ersetzen, obwohl ich nicht sicher bin, ob ein Compiler das tatsächlich tut.

Readonly hingegen ist eine Mitgliedsvariable, deren Wert sich nach der Initialisierung nicht mehr ändern sollte, was bedeutet, dass es sich nicht um eine Konstante handelt, Sie können etwas in der Art von readonly DateTime time = DateTime.Now; . Dabei handelt es sich natürlich nicht um ein statisches Mitglied, sondern um ein normales Mitglied mit der Einschränkung, dass es nach der Zuweisung nicht mehr geändert werden kann. Der Vorteil im Vergleich zu const ist, dass wenn sich Ihre const-Variable in einem Build ändert, andere abhängige Bibliotheken das nicht wissen - sie können sogar den konstanten Wert einkompiliert haben - Sie müssen alles neu erstellen.

Und was die Frage angeht, warum resharper readonly vs. const vorschlägt - ich bin mir nicht sicher, ich würde vermuten, dass eine readonly-Variable weniger restriktiv ist, und es ist anzunehmen, dass der Entwickler das wahrscheinlich wollte.

3voto

Hogan Punkte 65759

Resharper ist ein Werkzeug, das nur den Code sehen kann, den Sie ihm zeigen. Wenn Sie planen, den Code in der Zukunft zu ändern, kann Resharper das nicht wissen - also macht es Vorschläge auf der Grundlage des aktuellen Codes.

3voto

AakashM Punkte 60642

Resharper zeigt an, dass die Datei schreibgeschützt werden kann.

Ergänzend zu den anderen Antworten sei darauf hingewiesen, dass Sie den Schweregrad dieser Prüfung in ReSharper | Options | Code Inspection | Inspection Severity | Field can be made readonly . Sie können ReSharper bitten, diese Inspektion vollständig zu ignorieren, wenn Sie dies wünschen.

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