Les méthodes statiques sont beaucoup plus rapides et utilisent beaucoup moins de mémoire. Il y a cette idée fausse que c'est juste un peu plus rapide. C'est un peu plus rapide tant que vous ne le mettez pas sur des boucles. BTW, certaines boucles semblent petites mais ne le sont vraiment pas parce que l'appel de méthode contenant la boucle est aussi une autre boucle. Vous pouvez indiquer la différence de code qui effectue les fonctions de rendu. Beaucoup moins de mémoire est malheureusement vraie dans de nombreux cas. Une instance permet un partage facile des informations avec les méthodes soeurs. Une méthode statique demandera l'information quand il en a besoin. Mais comme dans la conduite des voitures, la vitesse apporte la responsabilité. Les méthodes statiques ont généralement plus de paramètres que leur contrepartie d'instance. Étant donné qu'une instance prendrait soin de mettre en cache des variables partagées, vos méthodes d'instance sembleront plus belles.
ShapeUtils.DrawCircle(stroke, pen, origin, radius);
ShapeUtils.DrawSquare(stroke, pen, x, y, width, length);
VS
ShapeUtils utils = new ShapeUtils(stroke,pen);
util.DrawCircle(origin,radius);
util.DrawSquare(x,y,width,length);
Dans ce cas, chaque fois que les variables d'instance sont utilisées par toutes les méthodes la plupart du temps, les méthodes d'instance sont assez la peine. Les instances ne concernent PAS L'ÉTAT, mais le PARTAGE, bien que l'ÉTAT COMMUN soit une forme naturelle de PARTAGE, elles ne sont PAS LES MÊMES. La règle générale est la suivante: si la méthode est étroitement liée à d'autres méthodes --- ils s'aiment tellement que quand on est appelé, l'autre doit être appelé aussi et ils partagent probablement la même tasse d'eau-- -, il devrait être fait instance. Traduire des méthodes statiques en méthodes d'instance n'est pas si difficile. Vous avez seulement besoin de prendre les paramètres partagés et de les mettre comme variables d'instance. L'inverse est plus difficile.
Ou vous pouvez créer une classe de proxy qui établira un pont entre les méthodes statiques. Bien que cela puisse paraître plus inefficace en théorie, la pratique raconte une histoire différente. C'est parce que chaque fois que vous devez appeler un DrawSquare une fois (ou dans une boucle), vous allez directement à la méthode statique. Mais quand vous l'utiliserez encore et encore avec DrawCircle, vous utiliserez le proxy d'instance. Un exemple est les classes System.IO FileInfo (instance) vs File (static).
Les méthodes statiques sont testables. En fait, encore plus testable que l'instance une fois. La méthode GetSum (x, y) serait très testable non seulement pour le test unitaire, mais aussi pour le test de charge, le test intégré et le test d'utilisation. Les méthodes d'instance sont bonnes pour les tests d'unités mais horribles pour tous les autres tests (ce qui compte plus que les tests d'unités BTW) c'est pourquoi nous avons tant de bugs ces jours-ci. La chose qui rend toutes les méthodes indétachables sont des paramètres qui n'ont pas de sens comme (Sender s, EventArgs e) ou un état global comme DateTime.Now. En fait, les méthodes statiques sont si bonnes au testabilité que vous voyez moins de bogues dans le code C d'une nouvelle distribution Linux que votre programmeur OO moyen (il est plein de s *** je sais).
Je pense que cela devrait être migré vers cs.SE –