Méthodes statiques vs les méthodes d'instance en C#
Pour une application que je suis en train d'écrire, je veux avoir l'extrême de l'extensibilité et de la vulgarisation des méthodes semblent me donner ce que je veux, en plus de la capacité à les appeler sans une instance, dont j'ai besoin aussi.
Je me souviens avoir lu que les méthodes statiques sont plus rapides que les méthodes d'instance, mais ne pas obtenir les avantages de la GC. Est-ce correct?
Il est très peu probable que je vais changer mon design à moins que je trouve une alternative supérieure design et de la vitesse. Mais toujours pour de l'information supplémentaire, je veux savoir les différences dans la vitesse, la GC, etc.
EDIT: Merci. Plus d'infos: disons que nous avons une classe de Personne:
class Person
qui peut avoir une instance méthode de la Distance donc, comme:
this.Distance (Person p)
Ce qui est excellent, mais cela ne me donne pas la possibilité de calculer la distance entre 2 points (disons Point3), sans création d'instances de la classe Personne.
Ce que je veux faire, c'est ceci:
class Person (no Distance methods)
mais l'extension des méthodes de Distance:
Distance (this Person, Person)
Distance (this Point3, Point3)
Cette façon, je peux à la fois faire:
myPerson.Distance (yourPerson)
et
Extensions.Distance (pointA, pointB)
EDIT2: @Jon, oui, je pense que c'est ce qui est signifié par (ne pas obtenir les avantages de la GC), mais j'ai un peu pensé que les méthodes statiques créer cette charge/surcharge.
Vous devez vous connecter pour publier un commentaire.
Qu'entendez-vous par "ne pas obtenir les avantages de la TABLE"? Les méthodes ne sont pas des ordures collectées - les instances sont.
Les méthodes virtuelles sont légèrement plus lent que les non-virtuels, et je pense qu'il y a ce fichus null vérifier avant tout de la méthode d'instance, mais ce n'est pas significative. Aller avec la conception la plus appropriée.
Méthodes statiques sont une douleur pour tester si - par exemple, si vous authentifier dans la méthode
Foo()
en appelant la méthode statique, alors quand vous faites des testsFoo()
vous ne pouvez pas faire, il suffit d'appeler un simulacre d'authentificateur (à moins que la méthode statique lui-même vous permet de le faire). Si vous donnez à l'instance originale de ce que vous faites des tests, une maquette de la mise en œuvre d'une interface contenant unAuthenticate()
méthode, cependant, vous pouvez le faire se comporter comme vous le souhaitez.EDIT: Dans ce cas, il semble que vous avez vraiment besoin est une méthode d'instance sur votre
Point
type de calculer la distance entre deux points ("ce" l'un et l'autre), ou potentiellement statique méthode de fabrique sur leDistance
type.Le choix entre statique et les méthodes d'instance est une question de conception orientée objet. Si la méthode que vous écrivez est un comportement d'un objet, alors il devrait être une méthode d'instance. Si il ne dépend pas d'une instance d'un objet, il doit être statique.
Fondamentalement, les méthodes statiques appartiennent à un type pendant que les méthodes d'instance appartiennent à des instances d'un type.
GetAge
de sens que comme une méthode d'instance. Je ne suis pas clair sur ce dernier si.CustomerDAL
de la classe qui a un méthodeGetAllCustomers(..)
....même queEmployeeDAL
qui aGetAllEmployees()
.....devrait être les méthodes d'instance ? et si ce genre de méthode (veuillez fournir exemple) doit être statique dans ces classes ?Si en étant plus rapide tu veux dire que le code à l'intérieur de la méthode est exécutée plus rapidement, alors non. Un code dans une méthode statique est tout aussi rapide que le code dans un non méthode statique.
Si vous parler à propos de la surcharge de l'exécution de l'appel à la méthode, elle devient un peu plus complexe. Il est commun pour les langues comme Java exemple des appels à davantage de ressources. En C# ce n'est pas le cas, cependant, parce que les méthodes d'instance ne sont pas virtuels par défaut.
Donc une méthode virtuelle a un peu plus de ressources qu'un non méthode virtuelle. Les méthodes statiques ne peuvent pas être virtuelle, mais les méthodes d'instance peut être déclarée virtuelle.
Comme pour la collecte des Ordures, c'est surtout pertinente pour les champs, pas de méthodes. Les champs statiques peuvent être accessibles à partir de partout dans le code de sorte que le garbage collector ne peut pas déterminer si la référence sera utilisé à nouveau, de sorte qu'il n'est jamais perçue.
Basé sur votre exemple, je voudrais écrire un statique de la fonction d'utilité pour trouver la distance entre deux points:
Et puis je voudrais donner à la Personne une propriété appelée Position qui a renvoyé un point. J'ai donc pu écrire:
Il est pratiquement en anglais déjà - pourquoi le rendre plus obscures? Si vous faire de la Distance d'une méthode, vous pouvez écrire:
ou:
Il n'y a pas de différence entre ces deux ordres, et pourtant, l'utilisation de la méthode-la syntaxe d'appel suggère qu'il pourrait y avoir une différence.