418 Stimmen

Die Methode kann statisch gemacht werden, aber sollte sie das auch?

ReSharper weist gerne auf mehrere Funktionen pro ASP.NET-Seite hin, die statisch gemacht werden könnten. Hilft es mir, wenn ich sie statisch machen? Sollte ich sie statisch machen und sie in eine Utility-Klasse verschieben?

296voto

Jon Skeet Punkte 1325502

Leistung, Namespace-Verschmutzung usw. sind meiner Meinung nach zweitrangig. Fragen Sie sich, was logisch ist. Arbeitet die Methode logisch auf einer Instanz des Typs, oder ist sie mit dem Typ selbst verbunden? Wenn letzteres der Fall ist, machen Sie sie zu einer statischen Methode. Verschieben Sie sie nur dann in eine Hilfsklasse, wenn sie sich auf einen Typ bezieht, der nicht unter Ihrer Kontrolle steht.

Manchmal gibt es Methoden, die logischerweise auf eine Instanz wirken, aber keinen der Zustände der Instanz verwenden dennoch . Wenn Sie zum Beispiel ein Dateisystem bauen und das Konzept eines Verzeichnisses haben, es aber noch nicht implementiert haben, könnten Sie eine Eigenschaft schreiben, die die Art des Dateisystemobjekts zurückgibt, und es würde immer nur "Datei" sein - aber es ist logisch mit der Instanz verbunden und sollte daher eine Instanzmethode sein. Das ist auch wichtig, wenn Sie die Methode virtuell machen wollen - Ihre spezielle Implementierung braucht vielleicht keinen Status, aber abgeleitete Klassen schon. (Zum Beispiel, wenn Sie eine Sammlung fragen, ob sie schreibgeschützt ist oder nicht - Sie haben vielleicht noch keine schreibgeschützte Form dieser Sammlung implementiert, aber es ist eindeutig eine Eigenschaft der Sammlung selbst, nicht des Typs.)

273voto

Jeff Yates Punkte 59874

Statische Methoden versus Instanzmethoden
Statische und Instanzmitglieder der C# Sprachspezifikation erklärt den Unterschied. Im Allgemeinen können statische Methoden eine sehr geringe Leistungsverbesserung gegenüber Instanzmethoden bieten, allerdings nur in extremen Situationen (siehe 本答 für weitere Einzelheiten dazu).

Die Regel CA1822 in FxCop oder Code Analysis besagt:

"Nach der [Markierung von Mitgliedern als statisch] gibt der Compiler nicht-virtuelle Aufrufseiten zu diesen Mitgliedern aus, was eine Prüfung zur Laufzeit für jeden Aufruf verhindert, der sicherstellt, dass der aktuelle Objektzeiger nicht-null ist. Dies kann zu einem messbaren Leistungsgewinn für leistungssensiblen Code führen. In einigen Fällen kann der fehlende Zugriff auf die aktuellen Objektinstanz ein Korrektheitsproblem dar."

Utility-Klasse
Sie sollten sie nicht in eine Gebrauchsklasse verschieben, es sei denn, es macht in Ihrem Entwurf Sinn. Wenn sich die statische Methode auf einen bestimmten Typ bezieht, wie eine ToRadians(double degrees) Methode sich auf eine Klasse bezieht, die Winkel repräsentiert, ist es sinnvoll, dass diese Methode als statisches Mitglied dieses Typs existiert (Achtung, dies ist ein verworrenes Beispiel zu Demonstrationszwecken).

65voto

Mark Cidade Punkte 95914

Markierung einer Methode als static innerhalb einer Klasse macht deutlich, dass sie keine Instanzmitglieder verwendet, was hilfreich sein kann, wenn man den Code überfliegt.

Sie müssen sie nicht unbedingt in eine andere Klasse verschieben, es sei denn, sie soll von einer anderen Klasse genutzt werden, die konzeptionell ebenso eng mit ihr verbunden ist.

22voto

JasonTrue Punkte 18756

Ich bin mir sicher, dass dies in Ihrem Fall nicht der Fall ist, aber ein "übler Geruch", den ich in einem Code gesehen habe, den ich durch die Beibehaltung einer großen Anzahl statischer Methoden erleiden musste.

Leider handelte es sich dabei um statische Methoden, die einen bestimmten Anwendungszustand voraussetzten. (Warum auch immer, wir werden nur einen Benutzer pro Anwendung haben! Warum soll die Klasse User das nicht in statischen Variablen festhalten?) Sie waren glorifizierte Möglichkeiten, auf 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 recht nützlich, wenn sie die Domänenlogik herausrechnen, die nicht vom Zustand einer Instanz des Objekts abhängt. Sie können Ihren Code viel lesbarer machen.

Achten Sie nur darauf, dass Sie sie an der richtigen Stelle platzieren. Greifen die statischen Methoden in den internen Zustand anderer Objekte ein? Kann man gut begründen, dass ihr Verhalten stattdessen zu einer dieser Klassen gehört? Wenn Sie die Belange nicht richtig trennen, könnten Sie später Kopfschmerzen bekommen.

15voto

pajics Punkte 2758

Dies ist eine interessante Lektüre:
http://thecuttingledge.com/?p=57

ReSharper schlägt eigentlich nicht vor, dass Sie Ihre Methode statisch machen. Sie sollten sich fragen, warum diese Methode in dieser Klasse ist und nicht in einer der Klassen, die in der Signatur auftauchen...

aber hier ist, was ReSharper Dokumentaion sagt: http://confluence.jetbrains.net/display/ReSharper/Member+kann+statisch+gemacht+werden

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