web-dev-qa-db-fra.com

Membres de classe statiques vs non statiques

Je suis nouveau en c sharp et en programmation en général. J'ai une question rapide - quelle est la meilleure pratique en ce qui concerne les variables statiques/non statiques.

J'ai une variable, int int privée, qui appartient à la classe y. Pour accéder à cette variable, j'ai besoin de référencer y. Si x était cependant statique, je peux accéder à cette variable sans référence à y.

Quelle est la meilleure façon de procéder, dans une situation où plusieurs méthodes de la classe y référenceront cette valeur?

J'espère que cela a du sens, et ma question n'est pas trop basique!

Merci beaucoup

25
Sherlock

Vous devez considérer les variables statiques comme appartenant à la classe , pas aux instances de la classe.

Si, dans toutes les instances de la classe, cette variable doit être identique, utilisez une variable statique.

Sinon, utilisez une variable d'instance.

En général, avoir des variables statiques publiques est mauvaise pratique - c'est une ressource globale partagée et si vous la changez, vous devez synchroniser l'accès à celle-ci. Avoir un état global est quelque chose que vous voulez éviter autant que possible.

50
Oded

La meilleure pratique consiste à éviter les parasites publics. Dans la POO, la classe est censée cacher ses membres. Static n'est en fait pas membre de l'instance mais du type .

La statique est utile si vous implémentez un modèle singleton. Mais là encore, ils doivent être rendus privés et accessibles via une propriété publique.

Vous devez lire Classes statiques et membres de classes statiques (Guide de programmation C #) .

8
Aliostad

Eh bien, je ne peux pas dire avec certitude que l'un est meilleur, car ils servent à des fins différentes.

Connaissez-vous la POO? Dans la POO, les objets statiques ou les membres d'une classe accessibles directement à partir de la classe, tandis que les membres non statiques ne sont accessibles qu'à partir de l'instance à laquelle ils appartiennent.

C # suit un principe similaire pour les méthodes. Les méthodes statiques sont accessibles directement à partir de la classe, tandis que les méthodes non statiques (ou les méthodes d'instance comme j'aime les appeler) doivent être accessibles à partir d'une instance. C'est pourquoi l'instauration doit être effectuée pour les méthodes d'instance, tandis que pour les méthodes statiques, elle n'est tout simplement pas nécessaire, et en outre peu pratique (voir ci-dessous).

Dans la POO, les variables statiques sont utilisées pour les valeurs qui ne peuvent pas être stockées par une variable d'instance. Exemple: supposait que vous vouliez compter le nombre d'instances d'une classe? Comment stockeriez-vous cela dans une seule instance?

Les méthodes utilisent un principe similaire. Ils doivent être utilisés pour les procédures pour lesquelles il est impossible de le faire dans une instance d'une classe. J'ai tendance à les utiliser pour des procédures générales (pas un terme technique), c'est-à-dire celles qui ne nécessitent pas que j'instancie un objet. Exemple, ajout de deux paramètres. (Cette utilisation peut être correcte ou non, mais je pense que oui)

Cependant, si vous souhaitez ajouter deux propriétés d'un objet, la méthode ne peut pas être statique, car comme vous vous en rendrez vite compte, les méthodes statiques ne peuvent pas accéder aux méthodes ou variables d'instance au sein d'une classe. Bien sûr, cela a du sens parce que cette méthode statique ne saurait pas de quelle instance de la classe les obtenir à moins qu'elle ne soit informée, car elle ne fait pas partie d'une instance elle-même)

Pour ne pas compliquer les choses, je m'arrête ici. Faites-moi savoir si vous avez mal compris quoi que ce soit.

4
Arash Afshinfar

Votre choix dépend de votre architecture.

Static fait partie d'un Type, d'autres font partie d'un instance de ce type. Si vous voulez avoir un état partagé (par exemple) entre différents instances du même type, utilisez static. Si vous voulez que chaque instance ait sa propre valeur, indépendamment des autres, utilisez les champs instance.

Dans les deux cas, au fait, évitez d'exposer comme un fields public, mais utilisez des propriétés.

3
Tigran

Je suis entièrement d'accord avec M. Oded :

Si, dans toutes les instances de la classe, cette variable doit être identique, utilisez une variable statique.

Sinon, utilisez une variable d'instance.

Oui, l'ajout de static à un membre de la classe signifie essentiellement que vous pouvez y accéder sans instance, et uniquement en dehors de toute instance. Et oui, cela devient une ressource globale , ou même une variable globale si vous voulez.

Mais je pense qu'il y a au moins un autre ( lourdement édité ) bon point à faire ici ...

Utiliser des membres statiques comme vars globaux va à l'encontre OOP

Cela signifie qu'une fois que vous avez défini un membre statique, vous ne pouvez plus le passer en tant qu'objet. Plus vous utilisez statique comme variable globale, plus il est difficile pour tests unitaires / mock ing classes .

Il existe une solution pour cela, Singletons . Mais ils ne devraient jamais venir sans avertissements !

D'un autre côté, si vous êtes sûr que vous avez vraiment besoin de vars globaux, jetez un œil au Boîte à outils modèle . C'est une extension peu connue du modèle Singleton. C'est tellement inconnu en fait, si vous le recherchez sur Google, vous ne le trouverez pas avec ces mots clés ( modèle de boîte à outils).

Alors planifiez à l'avance. Lire la suite. Apprenez à connaître toutes les options pour pouvoir mieux décider. Obtenez même un livre. La programmation orientée objet consiste davantage à appliquer des concepts qui vous aideront à long terme qu'à faire fonctionner les choses maintenant.

1
cregox

En général, si vous voulez avoir une variable publique, statique ou instance, vous devez l'encapsuler dans une propriété et l'exposer comme ça. C'est à coup sûr un principe que vous aimerez suivre.

Mais malgré certaines des autres réponses, je ne peux pas dire de ne pas utiliser d'électricité statique. La statique n'est pas le diable à éviter en tout cas. Ce que vous devez faire décidera si vous allez utiliser statique ou non, tant que vous gardez votre programme propre et facile à entretenir.

En termes simples, et non dans le langage des anciens, statique signifie quelque chose qui n'appartient à aucune instance de cette classe mais qui a un effet sur eux. Un exemple de propriété statique dans une classe qui génère des instances est par exemple un facteur, qui doit être global pour toutes les instances de la classe, pour participer à un calcul qui se fait à l'intérieur des instances. Dans ce cas, et à mon avis, il est préférable d'avoir ce facteur déclaré comme statique plutôt que de l'avoir dans chaque cas. Surtout si ce facteur change dans la durée de vie de votre programme pour affecter le prochain calcul.

0
Dummy01

Vous devez vous poser une question: pourquoi ai-je besoin que x soit statique?

Si vous rendez x statique, cela signifie que x fait partie de tous les objets de la classe A, mais lorsque x n'est pas statique, cela signifie que x n'est qu'une partie d'un seul objet.

En général, l'utilisation de champs statiques est pénible pour le suivi des bogues, mais dans certains cas, cela est très utile.

Je vous suggère de regarder dans l'utilisation de singelton http://en.wikipedia.org/wiki/Singleton

0
Alex Klimashevsky