Statische Methoden vs. Methoden einer Instanz in C#
Für eine Anwendung, die ich Schreibe, will ich haben extreme Erweiterbarkeit und die Erweiterung Methoden scheinen mir zu geben was ich will, plus die Fähigkeit, Sie zu nennen, ohne eine Instanz, die Brauch ich auch.
Ich erinnere mich gelesen zu haben, dass statische Methoden sind schneller als Instanz-Methoden, aber nicht bekommen, die Vorteile von GC. Ist das richtig?
Es ist höchst unwahrscheinlich, dass ich mein design ändern, es sei denn, ich finde eine bessere alternative, die von design keine Geschwindigkeit. Aber immer noch für die zusätzlichen Informationen, die ich wissen möchte, sind die Unterschiede in der Geschwindigkeit, GC, etc.
EDIT: vielen Dank. Mehr info: sagen wir, wir haben eine Klasse "Person":
class Person
kann eine Instanz haben, die Distanz-Methode, so wie:
this.Distance (Person p)
Das ist toll, aber nicht geben mir die Fähigkeit zur Berechnung der Entfernung zwischen 2 Punkten (sagen Punkt3) ohne das erzeugen von Instanzen der Klasse "Person".
Was ich tun will, ist dies:
class Person (no Distance methods)
aber Erweiterung Methoden der Entfernung:
Distance (this Person, Person)
Distance (this Point3, Point3)
Diese Weise kann ich beides tun:
myPerson.Distance (yourPerson)
und
Extensions.Distance (pointA, pointB)
EDIT2: @Jon, ja, ich glaube, das war, was gemeint war, indem Sie (erhalten nicht die Vorteile der GC), aber ich dachte irgendwie, dass die statischen Methoden erstellen, die diese Belastung/Mehraufwand.
InformationsquelleAutor Joan Venge | 2009-02-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was meinst du mit "nicht bekommen, die Vorteile von GC"? Methoden nicht die garbage Collection - Instanzen sind.
Virtuelle Methoden sind leicht langsamer als nicht virtuelle, und ich denke, es gibt die lästigen null-check vor jeder Instanz-Methode, aber es ist nicht signifikant. Gehen Sie mit den am besten geeigneten design.
Statische Methoden sind eine Qual für die Prüfung, aber - zum Beispiel, wenn Sie authentifizieren sich in der Methode
Foo()
durch Aufruf der statischen Methode, dann, wenn Sie die PrüfungFoo()
Sie es nicht schaffen, rufen Sie ein mock-authentifikator (es sei denn, die statische Methode selbst können Sie das tun). Wenn Sie uns die original-Instanz, was auch immer du bist-Tests ein mock-Implementierung-Schnittstelle, die eineAuthenticate()
Methode, aber Sie können es sich Verhalten, wie Sie wollen.EDIT: In diesem Fall, es klingt wie das, was Sie wirklich brauchen, ist eine Instanz-Methode auf die
Point
geben Sie zur Berechnung der Entfernung zwischen zwei Punkten ("dieser" dem einen oder anderen) - oder möglicherweise eine statische factory-Methode auf dieDistance
geben.Dank Jon. Ich habe keine Entfernung geben, weil es nur ein float. Die Instanz Ding ist, wo ich nicht sicher bin, ob zu verwenden. Wie kann ich die Distanz-Methode in Punkt, aber ich möchte auch sagen, PointToRGBColor, aber in meinem Entwurf für mich scheint es, wie das RGB-Methode sollte auch die Erweiterung.
Jetzt instancing hier macht 100% Sinn, wie die RGB-Methode könnte in der Color-Klasse. Aber das hindert mich zu tun, die direkte Verwendung der Funktionalität, wenn es sein muss, eine Instanz. Zum Punkt, es ist in Ordnung, denn es ist die einfachste Art muss man haben, es zu benutzen.
Hmm... ich bin nicht wirklich nach der Punkt - /RGB-Beispiel. Es könnte Sinn machen, als eine Erweiterung Methode, wenn es nur geeignet, in einigen Kontexten (anstatt immer, für jeden Punkt in einer beliebigen Anwendung). Ich würde raten, nicht zu über Bord mit der Erweiterung Methoden.
InformationsquelleAutor Jon Skeet
Wahl zwischen statischen und Instanz-Methoden ist eine Frage des Objekt-orientierten design. Wenn die Methode, die Sie schreiben, ist ein Verhalten von einem Objekt, dann sollte es eine Instanz-Methode. Wenn Sie hängt nicht von einer Instanz eines Objekts, es sollte statisch sein.
Grundsätzlich statische Methoden gehören zu einer Art, während die Instanz-Methoden gehören zu den Instanzen eines Typs.
GetAge
macht Sinn, wie eine Instanz-Methode. Ich bin mir nicht klar, auf die letztere, obwohl.So
CustomerDAL
Klasse hat einen - MethodeGetAllCustomers(..)
....gleiche wieEmployeeDAL
dieGetAllEmployees()
.....sollte die Instanz-Methoden ? und wenn ja - welche Art von Methode (geben Sie bitte Beispiel) sollte statisch sein, in diesen Klassen ?InformationsquelleAutor Mehrdad Afshari
Wenn durch schneller du meinst den code innerhalb der Methode ausgeführt wird schneller, dann nicht. Einen code in eine statische Methode ist nur so schnell wie der code in eine nicht statische Methode.
Wenn Ihr reden über den Aufwand für das ausführen der Aufruf der Methode wird es ein wenig komplexer. Es ist üblich, für Sprachen wie Java, die Instanz fordert, haben mehr Aufwand. In C# ist dies nicht der Fall, da Instanz-Methoden sind nicht virtuell standardmäßig.
So eine virtuelle Methode hat etwas mehr Aufwand als eine nicht-virtuelle Methode. Statische Methoden können nicht virtuell sein, aber die Instanz-Methoden können als virtual deklariert werden.
Als für die Garbage-collection, dies ist vor allem relevant für Felder, nicht die Methoden. Statische Felder zugegriffen werden kann von überall im code, so dass der garbage collector nicht feststellen kann, ob der Bezug wird wieder verwendet werden, so ist es nie gesammelt werden.
InformationsquelleAutor DefLog
Basierend auf deinem Beispiel, würde ich schreiben, eine statische utility-Funktion, die den Abstand zwischen zwei Punkten:
Dann würde ich der Person eine Eigenschaft namens Position, dass wieder ein Punkt. Also könnte ich schreiben:
Es ist praktisch, im englischen schon - warum machen es die mehr verdecken? Wenn Sie Abstand eine Methode, dann kann man schreiben:
oder:
Gibt es keinen Unterschied zwischen diesen zwei Ordnungen, und doch ist die Verwendung von Methodenaufrufen syntax legt nahe, dass es könnte ein Unterschied sein.
Btw ich hatte nicht den zweiten Teil. Du meinst personA.Entfernung(personB) und Erweiterungen.Entfernung ist die gleiche?
Zuerst Frage ich personA um den Abstand zu personB, dann Frage ich personB, um die Entfernung zu personA. Die beiden Menschen, die sind vertauscht. Indem es eine Methode, die Sie implizieren, dass die person, ist es herauszufinden, in Ihre eigenen, einzigartigen, das ist irreführend. Ich empfehle gegen das hinzufügen einer Entfernung Methode
Ich weiß nicht, was du meinst, indem der Benutzer den Bau der Operationen. Könntest du etwas mehr ins detail gehen in Ihrer Frage?
Danke. Du meinst, ich soll eine statische Distanz-Methode? Oder redest du über die Instanz-Methode? Eine andere Sache zu beachten ist, ich bin versucht zu haben, LINQ syntax, wie person.Ein().B - ().C().D() ...
InformationsquelleAutor Daniel Earwicker