2012-04-08 14 views
7

Wie oft sollte ich generell statische Methoden verwenden? Wenn ich wie:Verwenden der statischen Methode vs. Objektmethode

Class1 _class34 = new Class1(parameter); 

Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4). 

oder

_class34.DoSomething(parameter1, parameter2, parameter3, parameter). 

das ich habe eine Tendenz des Aufrufs statische Methode einer Klasse und vorbei ein Objekt der Klasse wie im ersten Beispiel?

Was ist die beste Vorgehensweise in Bezug auf diese beiden Beispiele? Gibt es irgendwelche Leistungen, Design und allgemeine Praktiken, auf die ich achten sollte? Welchen sollte ich generell verwenden und welchen würden Sie in jedem Tag Codierungsszenarien wählen? Das erste Beispiel scheint einfacher zu lesen (Sie übergeben alle Parameter und tun etwas), in der zweiten müssen Sie zweimal lesen, dass Sie an einem Objekt arbeiten?

Es ist nicht wirklich eine große Sache, nur wundernd.

Antwort

11

Im Allgemeinen sollten statische Methoden nur verwendet werden, wenn alles, was Sie tun möchten, unabhängig von einer Instanz der Klasse ist. Wenn Sie direkt auf den Zustand einer bestimmten Instanz zugreifen oder diesen beeinflussen möchten, ist normalerweise eine nicht-statische Methode der richtige Weg.

+1

Einverstanden. Natürlich gibt es immer Ausnahmen, aber im Allgemeinen, wenn Sie eine Instanz der Klasse A an eine statische Methode der Klasse A weitergeben, tun Sie es wahrscheinlich falsch. –

+0

Wie sieht es in Fällen aus, in denen Sie zwei Instanzen der Klasse A an eine Methode übergeben, bei der keine Instanz "besitzt" oder Vorrang hat? –

+1

Sie meinen wie eine kommutative binäre Operation? Ich habe es in beiden Richtungen gesehen, würde aber wahrscheinlich immer noch eine nicht-statische Methode verwenden. – Taymon

0

Wenn Sie das Objekt brauchen, ich denke, Sie sollten den Anruf wie machen "_class34.DoSomething (Parameter1, Parameter2, Parameter3, Parameter)."

Wenn Sie es lesen, ist wie: Über das Objekt _Class34, etwas tun, mit diesen Parametern.

2

Es gibt keine "öfter" Antwort.
Es hängt alles von der Art der Nutzung ab.

Die Quintessenz ist: Wenn ein Objekt der angegebenen Klasse ausgeführt/verwendet wird, sollten Sie immer nicht-statische Methoden verwenden. Wenn jedoch keine einzelne Instanz der Klasse betroffen ist, sollten Sie immer statische Methoden verwenden.

In Ihrem Beispiel tun Sie Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4), was kein guter Ansatz ist, da es alle Möglichkeiten aussortiert, die Ihnen die objektorientierte Programmierung bietet (wie Polymorphismus usw.).

Ein gutes Beispiel für ein Szenario, in dem eine statische Funktion benötigt wird, sind Factory-Methoden wie String.Parse - die ohne eine spezifische Instanz von String beginnen, aber mit der String-Klasse verbunden sind.

+0

Ein anderes gängiges Beispiel ist das Laden eines Objekts aus einer Datei - das wird oft als statisch ausgeführt, das das Objekt zurückgibt, das von der Datei geladen wird. – Ricibob

2

Dies ist, was die Laufzeit bereits tut, hat jede Instanzmethode ein verstecktes 1. Argument, das dieses übergibt. Verfügbar in der Syntax einer Erweiterungsmethode.

Explizit die Arbeit der Laufzeit zu tun ist nicht besonders nützlich, die Syntax wird nur mehr ausführlich. Und schmerzhaft angesichts der Art von Namen, die Sie haben müssen. Betrachten Sie _this anstelle von _class34 :)

0

Die ganze Idee hinter objektorientierter Programmierung ist, dass Sie somefunction(somestruct) nicht schreiben müssen, wie Sie in der Vergangenheit tun müssten, aber Sie können stattdessen somestruct.somefunction() schreiben, was es viel klarer macht dass somefunction zu somestruct gehört.

Natürlich können Sie es tun, wie Sie wollen, aber denken Sie daran, dass Ihr zweites Beispiel ist die Weise, der Grund, dass Elementfunktionen erfunden wurden.

0

Statische Elemente können die Komponententests erschweren, daher müssen Sie vorsichtig sein, wie Sie sie verwenden.

In den meisten Fällen füge ich nicht statische Wrapper für Klassen hinzu, die statische Member enthalten, da ich sonst nicht in der Lage wäre, sie zu verspotten.

Static Methods are Death to Testability könnte Ihnen eine bessere Vorstellung davon geben.

0

Aber ich verwende standardmäßig Instanzmethoden. Ich neige dazu, Statik nur dann zu verwenden, wenn es sinnvoller ist als Instanzmethoden oder wenn es keinen anderen Weg gibt. Die Verwendung von Statik kann das Testen von Einheiten erschweren. Statische Methoden, die auch statische Felder verwenden, sind eine potentielle Quelle von Speicherlecks (ja, sogar in .NET).

So zum Beispiel ich Statik verwenden, wenn ich eine spezielle Methode zum Erstellen haben will mehr klar zu machen, was bei der Erstellung geschieht, wie wenn ich Objekt erstellen, indem sie aus einer Datei Deserialisieren:

MyClass myObject = MyClass.ReadFromFile("serialized.xml"); 

, die mehr ist lesbar als:

MyClass myObject = new MyClass("serialized.xml"); 

auch verwende ich Statik Methoden (und Mitglieder), wenn ich einige klassenweit Statusinformationen zwischen allen Instanzen gemeinsam nutzen möchten.

Natürlich statische Mitglied sind ein Muss, wenn Ihre ganze Klasse statisch ist.

Verwandte Themen