web-dev-qa-db-fra.com

Mot clé statique en c #

Je suis vraiment confus avec la vraie signification du mot-clé statique en C #. J'ai parcouru différents articles sur Internet, mais aucun d'eux ne m'aide vraiment à comprendre son sens et d'autres sources ne sont pas fiables. Je sais que Stack Overflow a des esprits brillants qui peuvent m'aider à comprendre le vrai sens de l'électricité statique comme

  • Quand ils sont initialisés.
  • méthodes, propriétés, classes et constructeurs statiques
  • Statique vs en lecture seule vs constante
46
Zerotoinfinity

En bref, statique signifie effectivement "associé à un type au lieu d'une seule instance du type". Il y a donc un ensemble de variables statiques pour un type (dans un AppDomain), que vous ayez 0 instance ou un million; vous n'avez pas besoin d'une instance pour accéder à un membre statique, etc.

Le point d'initialisation exact des variables statiques dépend de la présence ou non d'un constructeur statique, mais de manière très générale, il s'agit de "une fois, généralement avant que quelque chose d'important ne se produise. dans la classe". (Voir cet article de blog pour une description plus détaillée.)

Alors que les champs readonly peuvent être statiques ou instance (c'est-à-dire liés au type ou liés à une instance du type), les valeurs const sont toujours implicitement statique (ce sont des constantes au moment de la compilation, donc cela n'aurait aucun sens d'avoir une copie par instance).

Vous pouvez parfois voir static être décrit comme "partagé entre toutes les instances d'un type" - Personnellement je n'aime pas cette description, comme elle le suggère qu'il doit y avoir au moins une instance ... alors qu'en réalité, vous n'avez pas besoin d'instances pour utiliser un membre statique. Je préfère les considérer comme entièrement séparés, plutôt que d'être "partagés" entre les instances.

84
Jon Skeet

Je peux recommander cet article, il semble assez descriptif: Mot clé statique démystifié

Je recommanderais également un article officiel du Guide de programmation c # qui couvre les diverses utilisations du mot clé statique. Vous pouvez y aller car il existe de nombreux liens vers différents articles MSDN .: Classes statiques et membres de classes statiques (Guide de programmation C #)

12
Jan Kratochvil

Un peu de constante (const) et en lecture seule:

  • constant ou const est une variable qui ne peut pas être modifiée et dont la valeur est connue au moment de la compilation.
  • readonly est très similaire à constant, cela ne peut pas être modifié non plus, la différence est qu'un champ en lecture seule peut être modifié/initialisé une fois dans le constructeur. Après cela, readonly est identique à constant.

À l'aide d'exemples:

constant: 
const  int a=10; // value cannot be modified, value is known at compile time

Mais que faire lorsque nous voulons un champ constant dont la valeur n'est pas connue au moment de la compilation?

e.g const PersonClass a=new PersonClass("name"); // error

La réponse est un champ en lecture seule:

readonly:
readonly PersonClass a=new PersonClass("name"); // all correct
8
Lev

De la documentation:

Les initialiseurs de variable de champ statique d'une classe correspondent à une séquence d'affectations qui sont exécutées dans l'ordre textuel dans lequel elles apparaissent dans la déclaration de classe

Les membres statiques sont initialisés lors du premier accès à la classe et sont exécutés dans l'ordre textuel.

Static méthodes, les propriétés font partie de la classe et non de l'instance.

Static n'a rien à voir avec readonly ou constant. Static est un moyen comme un membre acessed , readonly et constant est bien comme un membre stocké/géré .

7
Tigran