C# instance de la classe avec une méthode statique vs statique de la classe de l'utilisation de la mémoire
Comment C#, ou d'autres langues d'ailleurs, de gérer l'allocation de la mémoire (et de mémoire de l'allocation entre ces deux scénarios:
1.) Une méthode d'une classe statique est invoquée.
public Program {
Foo foo = Loader.load();
}
public static Loader {
public static Foo load() {
return new Foo();
}
}
2.) Une méthode est appelée sur une instance, qui tombe alors hors de portée.
public Program {
Foo foo = new Loader().load();
}
public Loader {
public Foo load() {
return new Foo();
}
}
Je suppose que la statique de la classe est chargée, et le reste, dans la mémoire, alors que l'instance de classe succombe à la collecte des déchets à C#'s de loisirs. Sont là les avantages ou les inconvénients de ces deux paradigmes? Est-il jamais un moment où vous avez une classe qui ne doit jamais être instancié (c'est à dire une sorte de chargeur de ressources ou à l'usine), mais vous utilisez la deuxième méthodologie de toute façon de prendre avantage de la collecte des ordures?
La partie importante de ma question est de savoir si ou non le premier paradigme, tout en étant théoriquement correcte dans certaines circonstances, peuvent souffrir de conserver la mémoire inutilement.
- Le 2ème exemple semble incorrect pour moi. L'appel d'une méthode statique requiert l'un à préfixe avec le nom de classe. par exemple,
Loader.Load()
& pasnew Loader().Load()
- Vous avez raison, Shah - vous n'avez pas besoin d'une instance à l'appel d'une méthode statique. C'est un peu le point 🙂
- ah, les gars, vous êtes bien, merci, j'ai reformulé de manière à obtenir à la viande de la question que j'essayais de le demander.
- je pense que ce qu'il veut dire, sont les frais généraux d'avoir une statique de la classe supérieure de la création d'une nouvelle instance et l'appel d'une méthode de cette instance, puis de laisser la GC de les percevoir.
- La brièveté est l'âme de l'humour, merci pour résumant parfaitement à ma question en 5 mots, haha.
- Est
Program
unclass
ou quoi? Parce que vous n'utilisez pas de mot-clé pour la classe.
Vous devez vous connecter pour publier un commentaire.
Votre deuxième exemple ne fonctionne pas, donc nous allons explorer les options réelles:
1.) Une méthode d'une classe statique est invoquée.
2.) Une méthode statique dans une non-statique de la classe est appelée.
3.) Une méthode d'instance est appelée sur une instance
Les deux premiers sont les mêmes. L'appel d'une méthode statique est la même, peu importe si la classe est statique ou non.
La troisième option va créer une instance de la classe sur le tas. Que la classe n'a pas de membres de données, il ne sera quelque chose comme 16 octets. Il sera nettoyée par la suite, mais en raison de la petite taille, il n'a pas beaucoup d'importance quand ça arrive.
De l'appel d'une méthode d'instance est également légèrement différente d'une méthode statique. Une référence à l'instance de classe est envoyé, que vous pouvez accéder par le biais de la
this
mot-clé. Il fait peu de différence dans ce cas, comme il n'existe pas de données réelles de l'objet pour accéder à.La deuxième forme crée un temporaire
Loader
objet (qui est très bon marché). Vous aurez à charge le Chargeur de classe, peu importe l'approche que vous choisissez.Il y a très peu de performance (mémoire de sauvegarde) pour gagner ici. Vous le feriez normalement choisir pour un membre statique dans une classe statique si il n'y a pas d'état nécessaires à l'extérieur de l'méthodes locales de vars.
Une méthode statique, un champ, une propriété ou un événement est remboursable sur une classe, même si aucune instance de la classe a été créée.
http://msdn.microsoft.com/en-us/library/79b3xss3(SV.80).aspx
Dans ce sens, vos méthodes statiques se comporte comme il le ferait si vous avez utilisé de l'intérieur d'une instance de classe: c'est l'étendue du type.
Je ne trouve pas les sources, mais à partir de ma connaissance de la programmation, lorsque vous refernce une classe(non statique), c'est la structure qui est chargé dans la mémoire
La création d'une instance d'une classe juste pour appeler une méthode, serait perdre beaucoup de puissance de traitement(en raison de la création d'une instance, l'affectation de la mémoire, et la collecte des ordures).
Au lieu de garder la définition, puis au-dessus d'elle, une instance. Pourquoi ne pas tout simplement garder la définition(statique).
Aussi longtemps que vous n'avez pas stocker les données dans des variables statiques, votre méthode statique devrait prendre la même quantité de mémoire que votre non statique de la définition de la méthode. Mais à l'aide d'une méthode statique, seule la méthode seront gardés en mémoire et être prêt à être appelé à chaque fois que vous avez besoin sans créer des instances. Où que, si la méthode n'est pas statique, elle devra être instancié(à l'aide de la mémoire et de puissance de traitement) et les déchets collectés(libération de la mémoire et l'utilisation de l'uc) donc, il est certainement mieux à l'aide d'un membre statique. C'est ce qu'ils sont là.