class / struct

Références

L'actualité

Librairie

L'information

class static

Une classe statique est fondamentalement identique à une classe non statique, à une différence près : une classe statique ne peut pas être instanciée. En d'autres termes, vous ne pouvez pas utiliser le mot clé new pour créer une variable du type classe. étant donné qu'il n'y a aucune variable d'instance, vous accédez aux membres d'une classe statique en utilisant le nom de classe lui-même. Par exemple, si vous avez une classe statique nommée UtilityClass qui a une méthode statique publique nommée MethodA, vous appelez la méthode comme illustré dans l'exemple suivant :

Une classe statique peut servir de conteneur pratique pour des ensembles de méthodes qui opèrent simplement sur des paramètres d'entrée et n'ont pas à obtenir ou définir de champs d'instance internes. Par exemple, dans la bibliothèque de classes .NET Framework, la classe System.Math statique contient des méthodes qui effectuent des opérations mathématiques, sans qu'il soit nécessaire de stocker ou de récupérer des données spécifiques à une instance particulière de la classe Math. Autrement dit, vous appliquez les membres de la classe en spécifiant le nom de la classe et le nom de la méthode, comme illustré dans l'exemple suivant.

Comme c'est le cas avec tous les types de classe, les informations de type pour une classe statique sont chargées par le Common Language Runtime (CLR) .NET Framework lorsque le programme qui fait référence à la classe est chargé. Le programme ne peut pas spécifier exactement quand la classe est chargée. Toutefois, il est garanti qu'elle sera chargée, que ses champs seront initialisés et que son constructeur statique sera appelé avant que la classe soit référencée pour la première fois dans votre programme. Un constructeur statique est appelé une seule fois et une classe statique reste en mémoire pendant la durée de vie du domaine d'application dans lequel votre programme réside.

Pour créer une classe non statique permettant la création d'une seule instance d'elle-même, consultez Implémentation d'un singleton en C#.

La liste suivante fournit les fonctionnalités principales d'une classe statique :

  • Elle contient uniquement des membres statiques.
  • Elle ne peut pas être instanciée.
  • Elle est verrouillée (sealed).
  • Elle ne peut pas contenir de constructeurs d'instances.

La création d'une classe statique est par conséquent très semblable à la création d'une classe contenant uniquement des membres statiques et un constructeur privé. Un constructeur privé empêche la classe d'être instanciée. L'avantage de l'utilisation d'une classe statique est que le compilateur peut vérifier qu'aucun membre d'instance n'a été ajouté par erreur. Le compilateur garantit que les instances de cette classe ne peuvent pas être créées.

Les classes statiques sont scellées (sealed) et ne peuvent par conséquent pas être héritées. Elles ne peuvent hériter d'aucune classe à part Object. Les classes statiques ne peuvent pas contenir un constructeur d'instance. Toutefois, elles peuvent contenir un constructeur statique. Les classes non statiques doivent également définir un constructeur statique si la classe contient des membres statiques qui requièrent une initialisation non triviale. Pour plus d'informations, consultez Constructeurs statiques.

Exemple

Voici un exemple d'une classe statique qui contient deux méthodes qui convertissent la température des degrés Celsius en degrés Fahrenheit et des degrés Fahrenheit en degrés Celsius :


Membres static

Une classe non statique peut contenir des méthodes, des champs, des propriétés ou des événements statiques. Le membre statique peut être appelé sur une classe même quand aucune instance de la classe n'a été créée. Le membre statique est toujours accessible par le nom de la classe, et non par le nom de l'instance. Une seule copie d'un membre statique existe, quel que soit le nombre d'instances de la classe qui ont été créées. Les méthodes et propriétés statiques ne peuvent pas accéder à des champs ou des événements non statiques dans leur type contenant. Elles ne peuvent pas non plus accéder à une variable d'instance d'un objet quelconque à moins qu'elle soit passée explicitement dans un paramètre de méthode.

Il est plus courant de déclarer une classe non statique avec certains membres statiques que de déclarer une classe entière comme statique. Deux utilisations courantes des champs statiques consistent à conserver un décompte du nombre d'objets qui ont été instanciés ou à stocker une valeur qui doit être partagée entre toutes les instances.

Les méthodes statiques peuvent être surchargées mais pas substituées, car elles appartiennent à la classe et non pas à une instance de la classe.

Bien qu'un champ ne puisse pas être déclaré en tant que static const, un champ const est essentiellement statique dans son comportement. Il appartient au type, pas aux instances du type. Par conséquent, les champs const sont accessibles à l'aide de la même notation ClassName.MemberName utilisée pour les champs statiques. Aucune instance d'objet n'est requise.

C# ne prend pas en charge les variables locales statiques (variables déclarées dans la portée de la méthode).

Vous déclarez des membres de classe statique en utilisant le mot clé static avant le type de retour du membre, comme illustré dans l'exemple suivant :

Les membres statiques sont initialisés avant le premier accès au membre statique et avant que le constructeur statique, s'il en existe un, soit appelé. Pour accéder à un membre de classe statique, utilisez le nom de la classe au lieu d'un nom de variable pour spécifier l'emplacement du membre, comme illustré dans l'exemple suivant :

Si votre classe contient des champs statiques, fournissez un constructeur statique qui les initialise quand la classe est chargée.

Un appel à une méthode statique génère une instruction d'appel en langage MSIL (Microsoft Intermediate Language), alors qu'un appel à une méthode d'instance génère une instruction callvirt, qui vérifie également l'existence de références d'objet Null. Toutefois, la plupart du temps, l'écart de performances entre les deux n'est pas significatif.