224 votes

Avantages de l'utilisation de méthodes statiques privées

Lors de la création d'une classe dotée de méthodes privées internes, généralement pour réduire la duplication de code, ne nécessitant l'utilisation d'aucun champ d'instance, la déclaration de la méthode comme statique présente-t-elle des avantages en termes de performances ou de mémoire?

Exemple:

 foreach (XmlElement element in xmlDoc.DocumentElement.SelectNodes("sample"))
{
    string first = GetInnerXml(element, ".//first");
    string second = GetInnerXml(element, ".//second");
    string third = GetInnerXml(element, ".//third");
}
 

...

 private static string GetInnerXml(XmlElement element, string nodeName)
{
    return GetInnerXml(element, nodeName, null);
}

private static string GetInnerXml(XmlElement element, string nodeName, string defaultValue)
{
    XmlNode node = element.SelectSingleNode(nodeName);
    return node == null ? defaultValue : node.InnerXml;
}
 

Y a-t-il un avantage à déclarer les méthodes GetInnerXml () statiques? Pas de réponse d'opinion s'il vous plaît, j'ai un avis.

236voto

Scott Dorman Points 25000

À partir de la FxCop page de règle à ce sujet:

Après avoir marqué les méthodes statiques, le compilateur émet non-virtuel sites d'appel à ces membres. Émettant de la non-virtuel sites d'appel permettra d'éviter un contrôle au moment de l'exécution pour chaque appel, qui garantit que l'objet actuel du pointeur n'est pas null. Cela peut entraîner un gain de performance mesurables de performance sensibles au code. Dans certains cas, l'impossibilité d'accès à l'instance actuelle de l'objet représente une exactitude question.

99voto

Neil Whitaker Points 2886

Quand j'écris une classe, la plupart des méthodes se divisent en deux catégories:

  • Méthodes de changer le cours de l'instance de l'état.
  • Les méthodes d'aide qui ne changent pas l'objet actuel de l'état, mais de m'aider à calculer les valeurs j'ai besoin d'ailleurs.

Les méthodes statiques sont utiles, parce que juste en regardant sa signature, vous savez que l'appelant ne pas utiliser ou modifier l'instance actuelle de l'état.

Prenez cet exemple:

public de la Bibliothèque de classe
{
 private static Livre findBook(List<Livre> livres, string titre)
{
 // le code ici
}
}

Si une instance de la bibliothèque de l'état n'est jamais foiré, et je suis à essayer de comprendre pourquoi, je ne peux exclure des findBook que le coupable, simplement à partir de sa signature.

J'essaie de communiquer autant que je le peux avec une méthode ou d'une fonction de signature, et c'est une excellente façon de le faire.

82voto

Marek Takac Points 226

Un appel à une méthode statique génère une instruction d'appel en langage MSIL (Microsoft Intermediate Language), tandis qu'un appel à une méthode d'instance génère une instruction callvirt, qui vérifie également les références à un objet nul. Cependant, la plupart du temps, la différence de performance entre les deux n'est pas significative.

src: MSDN - http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.110).aspx

15voto

Kent Boogaart Points 97432

Oui, le compilateur n'a pas besoin de transmettre le pointeur implicite this aux méthodes static . Même si vous ne l'utilisez pas dans votre méthode d'instance, elle est toujours transmise.

4voto

Joel Coehoorn Points 190579

Cela vous oblige à vous rappeler de déclarer également tous les membres de classe que la fonction utilise comme statiques, ce qui devrait permettre d'économiser la mémoire de création de ces éléments pour chaque instance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X