2010-07-13 14 views
7

Die Art, wie ich es verstehe, eine Membervariable als statische in einer no-statischen Klasse deklariert verursacht, dass Mitglied Variable eindeutig sein, egal die Anzahl der Instanzen dieser Klasse.Welchen Sinn hat eine statische Methode in einer nicht statischen Klasse?

Nun, was passiert mit einer statischen Methode in nicht-statischen Klasse deklariert? Und (Am wichtigsten), was der Punkt, eine statische Methode in einer nicht-statischen Klasse zu deklarieren?

Vielen Dank für

+3

ich das Wort nicht ‚einzigartig‘ hier verwenden würde. Es ist _shared_ zwischen allen Instanzen. –

+0

@Henk Holterman: danke für die Korrektur mich. – Richard77

Antwort

4

Klassenmethode, die nur mit ihren Parametern funktioniert, keine Instanzmethoden aufruft und nicht mit Instanzelementen arbeitet, kann als statisch deklariert werden. Eigentlich sollte es für eine bessere Leistung als statisch deklariert werden, da die statische Methode diesen "Zeiger" nicht benötigt.

Betrachten Sie kleine Funktion, die zur Klasse gehört, macht einige Berechnungen mit seinen Parametern und gibt berechneten Wert zurück. Diese Funktion sollte statisch sein.

+1

Ich würde statische Korrektheitsprüfung höher als Leistung bewerten. Indem Sie eine Methode als statisch deklarieren, lassen Sie den Compiler wissen, dass er keine spezifischen Informationen für bestimmte Instanzen verwenden kann, so dass er Fehler oder Warnungen auslöst, wenn der Programmierer das trotzdem versucht, z. versucht es als Instanzmethode zu bezeichnen. – reinierpost

21

helfen Wenn die Methode etwas mit der Art zu tun hat, aber nicht die Instanz dann kann es statisch sein.

DateTime.Parse und Int32.Parse sind Beispiele.

+10

Und es gibt eine Richtlinie, dass "wenn es statisch sein kann, als es statisch machen". –

+2

Im Zusammenhang mit Henk Holtermans Kommentar: http://StackOverflow.com/Questions/790281 –

2

Zum Beispiel haben Sie eine Klasse zum Beispiel Bank_Account, in der Sie die Anzahl der für diese Klasse erstellten Objekte berechnen möchten.
Also, Sie haben ein statisches Feld sagen count. Wenn Sie dann ein Objekt der Klasse Bank_Account initialisieren, müssen Sie das Feld erhöhen, in dem die Anzahl der für diese Klasse erstellten Objekte gespeichert wird. Die Methode, die diese statische Variable inkrementiert, ist statisch, da sie für alle für diese Klasse erstellten Objekte identisch ist.

+0

Warum wird diese Antwort abgelehnt? :-(Es sagt auch, was 'ck's' Antwort sagt, aber es ist das Beispiel für eine solche Methode !! – Himadri

+1

Ich verstehe auch keinen Downvote: scheint mir, das ist ein wichtiger Punkt. Wenn Sie Daten haben, die ungefähr sind alle Instanzen oder jede Instanz, und nicht etwa eine bestimmte Instanz, dann sollte es statisch sein. Zum Beispiel habe ich erst gestern eine Klasse erstellt, in der ich jeder Instanz eine eindeutige ID zuweisen muss. Einen statischen Zähler zu erstellen, war ein einfacher und logischer Weg mach das. – Jay

1

Wie ck sagte, es kann Methoden sein, die etwas mit dem Typ zu tun hat. Es ist wichtig, daran zu denken, dass dies eine Dienstprogrammfunktion ist, die nicht auf alle Mitgliedsvariablen im Typ/Klasse zugreifen kann, da sie direkt aufgerufen werden kann, ohne irgendeine Instanz der Klasse zu haben. Wenn Sie versuchen, eine statische Methode zu definieren, die auf eine Membervariable (oder eine nicht statische Methode) zugreift, erhalten Sie tatsächlich einen Compilerfehler.

5

Es ist nützlich für das Erstellen von Factory-Methoden, die keine Mitglieder eines Objekts sind, aber Zugriff auf die Interna eines Objekts benötigen, um es zu initialisieren.

5

Sie benötigen statische Methoden in nicht statischen Klassen f.e. für die Fabrik-Muster (wenn die Klasse eine Fabrik für sich selbst ist, wie Jaco Pretorius wies darauf hin):

MyClass newInstance = MyClass.Create(); 

Oder wenn Sie Hilfsmethoden erstellt werden soll. F. e. Sie könnten einen FTP-Klasse schreiben, die voll arbeiten, mit Connect(), SendCommand(), ReceiveAnswer(), Disconnect() usw., aber Sie wollen, damit der Benutzer leicht eine Datei laden, ohne dass das gesamte Verfahren zu implementieren:

MyFTPClass.UploadFile("username", "password", "pathToFile"); 
+1

Ich bin pedantisch - dein erster Satz ist nur korrekt, wenn die Klasse eine Fabrik für sich selbst ist. Wenn ich das Fabrikmuster benutze, werde ich normalerweise separate Fabrikklassen erstellen, da es das Testen etwas einfacher macht. –

3

Es wäre unmöglich, das Singleton-Muster zu implementieren, ohne eine statische Methode (und eine private Membervariable) in einer nicht statischen Klasse deklarieren zu können.

Siehe Singleton

Verwandte Themen