Pourquoi ReSharper se plaint-il lorsqu'une méthode peut devenir statique, mais ne l'est pas ?
Est-ce parce qu'une seule instance d'une méthode statique est créée (sur le type) et ainsi gagner en performance ?
Pourquoi ReSharper se plaint-il lorsqu'une méthode peut devenir statique, mais ne l'est pas ?
Est-ce parce qu'une seule instance d'une méthode statique est créée (sur le type) et ainsi gagner en performance ?
Je trouve ce commentaire très utile car il met en évidence deux choses importantes :
Cela me fait me demander si la méthode en question devrait en fait faire partie du type ou non. Puisqu'elle n'utilise pas aucune donnée d'instance, vous devriez au au moins considérer si elle peut être déplacée vers son propre type. Est-il une partie intégrante du type, ou s'agit-il vraiment d'une fonction d'utilité générale ?
S'il est judicieux de conserver le méthode sur le type spécifique, il y a un gain de performance potentiel puisque le compilateur émettra un code différent pour une méthode statique.
Extrait de la documentation de FxCop pour le même avertissement (c'est nous qui soulignons) :
"Les membres qui n'accèdent pas aux données d'instance ou n'appellent pas les méthodes d'instance peuvent être marqués comme statiques (Shared dans Visual Basic). Après avoir marqué les méthodes comme statiques, le compilateur émettra des sites d'appel non virtuels pour ces membres. L'émission de sites d'appel non virtuels empêchera une vérification au moment de l'exécution pour chaque appel afin de s'assurer que le pointeur d'objet actuel n'est pas nul. Cela peut se traduire par un gain de performance mesurable pour le code sensible aux performances. Dans certains cas, l'impossibilité d'accéder à l'instance actuelle de l'objet représente un problème de correction. "
Très bon débat sur ce sujet ici (SO) . Je suis dans le camp de ceux qui pensent que si on peut le rendre statique, il faut le rendre statique. Je pense que c'est à cause de la notion de pourquoi on aurait une méthode d'instance qui n'utilise pas de données d'instance. S'agit-il vraiment d'une méthode d'instance dans ce cas ou d'une méthode de classe ?
Aucune instance de la classe n'a besoin d'être créée pour utiliser la méthode si elle est déclarée comme statique... ce qui permet d'économiser les cycles du processeur nécessaires au traitement de la construction, l'espace du tas et les cycles du processeur du collecteur d'ordures pour récupérer l'objet du tas...
Aussi, votre question, telle qu'elle est rédigée
" ... une seule instance d'une méthode statique est créée (sur le type) ... "
implique que pour une méthode d'instance, le code de la méthode est répété pour chaque instance de la classe qui est créée. Ce n'est pas le cas. Quel que soit le nombre d'instances que vous créez pour un type donné, le code des méthodes n'est chargé en mémoire qu'une seule fois. L'objet stocké sur le tas pour chaque instance ne stocke que l'"état" du type (champs non statiques et quelques variables de suivi diverses).
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.