Frage

Resharper zeigt gerne mehrere Funktionen pro ASP.NET -Seite, die statisch gemacht werden können. Hilft es mir, wenn ich sie statisch mache? Sollte ich sie statisch machen und sie in eine Versorgungsklasse verlegen?

War es hilfreich?

Lösung

Statische Methoden gegen Instanzmethoden
10.2.5 Statische und Instanzmitglieder der C# Sprachspezifikation erklärt den Unterschied. Im Allgemeinen können statische Methoden eine sehr geringe Leistungsverbesserung gegenüber Instanzmethoden bieten, jedoch nur in etwas extremen Situationen (siehe Diese Antwort für einige weitere Details dazu).

Regel CA1822 in FXCOP- oder Code -Analysezuständen:

"Nachdem [Mitglieder als statisch gekennzeichnet] wird der Compiler nicht virtuelle Anrufe an diese Mitglieder ausstrahlt, die eine Überprüfung zur Laufzeit für jeden Anruf verhindern, der sicherstellt Für leistungsempfindlichen Code. In einigen Fällen stellt das Versäumnis, auf die aktuelle Objektinstanz zuzugreifen, ein Problem der Korrektheit dar. "

Versorgungsklasse
Sie sollten sie nicht in eine Versorgungsklasse verlegen, es sei denn, es ist sinnvoll in Ihrem Design. Wenn sich die statische Methode auf einen bestimmten Typ bezieht, wie a ToRadians(double degrees) Die Methode bezieht sich auf eine Klasse, die Winkel darstellt. Es ist sinnvoll, dass diese Methode als statisches Mitglied dieses Typs existiert (beachten Sie, dass dies ein verwickeltes Beispiel für den Demonstrationszweck ist).

Andere Tipps

Leistung, Namespace -Verschmutzung usw. sind meiner Ansicht nach zweitrangig. Fragen Sie sich, was logisch ist. Funktioniert die Methode logisch auf einer Instanz des Typs oder hängt sie mit dem Typ selbst zusammen? Wenn es das letztere ist, machen Sie es zu einer statischen Methode. Bewegen Sie es nur in eine Versorgungsklasse, wenn es sich um einen Typ handelt, der nicht unter Ihrer Kontrolle steht.

Manchmal gibt es Methoden, die logischerweise auf eine Instanz wirken, aber zufällig keinen der Status der Instanz verwenden noch. Wenn Sie beispielsweise ein Dateisystem erstellt haben und das Konzept eines Verzeichnisses erhalten hätten, aber Sie es noch nicht implementiert hatten, könnten Sie eine Eigenschaft schreiben, die die Art des Dateisystemobjekts zurückgab, und es wäre immer gerechte "Datei" - aber sie hängt logischerweise mit der Instanz zusammen, und es sollte daher eine Instanzmethode sein. Dies ist auch wichtig, wenn Sie die Methode virtuell machen möchten - Ihre spezielle Implementierung benötigt möglicherweise keinen Zustand, aber abgeleitete Klassen könnten. (Wenn Sie beispielsweise eine Sammlung fragen, ob sie nur schreibgeschützt ist oder nicht, haben Sie möglicherweise noch keine schreibgeschützte Form dieser Sammlung implementiert, aber es ist eindeutig eine Eigenschaft der Sammlung selbst, nicht der Typ.)

Markieren einer Methode als static In einer Klasse wird deutlich, dass keine Instanzmitglieder verwendet werden, was hilfreich sein kann, wenn Sie den Code durchfliegen.

Sie müssen es nicht unbedingt in eine andere Klasse verschieben, es sei denn, es soll von einer anderen Klasse geteilt werden, die genauso eng assoziiert ist, Konzept.

Ich bin mir sicher, dass dies in Ihrem Fall nicht passiert, aber ein "schlechter Geruch", den ich in einem Code gesehen habe, den ich durch die Aufrechterhaltung einer Vielzahl von statischen Methoden erlitten habe.

Leider waren es statische Methoden, die einen bestimmten Anwendungszustand annahmen. (Warum haben wir nur einen Benutzer pro Anwendung! Warum nicht die Benutzerklasse in statischen Variablen verfolgen lassen?) Sie waren verherrlichte Möglichkeiten, globale Variablen zuzugreifen. Sie hatten auch statische Konstruktoren (!), Die fast immer eine schlechte Idee sind. (Ich weiß, dass es ein paar vernünftige Ausnahmen gibt).

Statische Methoden sind jedoch sehr nützlich, wenn sie die Domänen-logische Faktor fördern, die nicht von dem Zustand einer Instanz des Objekts abhängt. Sie können Ihren Code viel lesbarer machen.

Stellen Sie nur sicher, dass Sie sie an den richtigen Ort setzen. Manipuliert die statischen Methoden intrusiv den inneren Zustand anderer Objekte? Kann ein guter Fall angegeben werden, dass ihr Verhalten stattdessen zu einer dieser Klassen gehört? Wenn Sie Bedenken nicht richtig trennen, können Sie später Kopfschmerzen haben.

Das ist interessant. Lesen Sie:

http://thecuttingledge.com/?p=57

Resharper schlägt nicht vor, dass Sie Ihre Methode statisch machen. Sie sollten sich fragen, warum sich diese Methode in dieser Klasse befindet, im Gegensatz zu einer der Klassen, die in ihrer Unterschrift angezeigt werden ...

Aber hier ist, was Resharper Documentaion sagt:http://confluence.jetbrains.net/display/resharper/member+can+Made+Static

Nur um @jason true hinzuzufügen Antworten, Es ist wichtig zu erkennen, dass nur "statisch" einer Methode "statisch" eingeht, garantiert nicht, dass die Methode "rein" ist. Es wird in Bezug auf die Klasse, in der sie deklariert wird Ich persönlich neige dazu, statische Methoden zu bevorzugen, wenn ich kann, dass Sie, wenn sie rein sind, isoliert testen und vermitteln können, ohne sich um den umgebenden Zustand sorgen zu müssen.

Sie sollten in einem bestimmten Szenario das tun, was am lesbarsten und intuitivsten ist.

Das Leistungsargument ist nur in den extremsten Situationen, da das einzige, was tatsächlich geschieht, ein zusätzlicher Parameter ist (ein zusätzlicher Parameter (this) wird zum Beispielmethoden auf den Stapel gedrückt.

Für eine komplexe Logik innerhalb einer Klasse habe ich private statische Methoden gefunden, um isolierte Logik zu erstellen, bei denen die Instanzeingaben in der Methodensignatur klar definiert sind und keine Instanz-Nebenwirkungen auftreten können. Alle Ausgänge müssen über den Rückgabewert oder die Out/REF -Parameter erfolgen. Komplexe Logik in den Zusammenbruch der Logik in Nebeneffektfreie Codeblöcke Kann die Lesbarkeit des Codes und das Vertrauen des Entwicklungsteams darin verbessern.

Andererseits kann es zu einer Klasse führen, die durch eine Verbreitung von Nutzmethoden verschmutzt ist. Wie üblich können logische Benennung, Dokumentation und konsistente Anwendung von Teamcodierungskonventionen dies verringern.

Resharper überprüft die Logik nicht. Es prüft nur, ob die Methode Instanzelemente verwendet. Wenn die Methode privat ist und nur von (möglicherweise nur einer) Instanzmethoden aufgerufen wird, ist dies ein Zeichen, um eine Instanzmethode zu lassen.

Wenn die Funktionen auf vielen Seiten geteilt werden, können Sie sie auch in eine Basisseitenklasse einfügen und dann alle ASP.NET -Seiten mit dieser Funktionalität erben (und die Funktionen könnten auch immer noch statisch sein).

Wenn Sie eine Methode statisch erstellen, können Sie die Methode von außerhalb der Klasse aufrufen, ohne zuerst eine Instanz dieser Klasse zu erstellen. Dies ist hilfreich, wenn Sie mit Anbieterobjekten oder Add-Ons mit Drittanbietern arbeiten. Stellen Sie sich vor, Sie müssten zuerst ein Konsolenobjekt "con" erstellen, bevor Sie Con.WriteLine () aufrufen;

Es hilft, die Namespace -Verschmutzung zu kontrollieren.

Nur meine Tuppence: Wenn Sie alle gemeinsam genutzten statischen Methoden zu einer Versorgungsklasse hinzufügen, können Sie hinzufügen

using static className; 

Zu Ihren Verwenden von Anweisungen, die den Code schneller eingeben und einfacher zu lesen haben. Zum Beispiel habe ich eine große Anzahl von sogenannten "globalen Variablen" in einem Code, den ich geerbt habe. Anstatt globale Variablen in einer Klasse zu erstellen, die eine Instanzklasse war, habe ich sie alle als statische Eigenschaften einer globalen Klasse festgelegt. Es erledigt den Job, wenn es chaotisch ist, und ich kann nur die Eigenschaften mit Namen verweisen, weil ich den statischen Namespace bereits verwiesen habe.

Ich habe keine Ahnung, ob dies eine gute Praxis ist oder nicht. Ich habe so viel über C# 4/5 und so viel Legacy -Code für Refactor zu lernen, dass ich nur versuche, mich von den Roselyn -Tipps zu leiten.

Joey

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top