# Programmation C sharp/Les classes

La notion de classe est à la base de la programmation orientée objet. Elle définit un type d'objet. Ce type rassemble des variables (créées pour chaque objet et appelées « attributs ») et des fonctions (appelées dans ce cas « méthodes »).
Ces attributs et méthodes sont les « membres » de la classe. Ils peuvent avoir chacun un niveau de protection différent.

## Déclarer une classe

La déclaration d'une classe utilise le mot clé class :
Les membres sont définis à l'intérieur des accolades.
Exemple :

### Membres d'une classe

Les membres d'une classe sont de différents types :
* Les fonctions, appelées méthodes, traitent les données, appellent d'autres méthodes, retournent éventuellement une valeur ;
* Les variables, appelées attributs, stockent les données ;
* Les propriétés sont des méthodes spéciales utilisées comme des variables.

### Membres statiques de classe et membres d'instance

Un membre statique de classe est un membre déclaré avec le mot clé static. Il est défini une seule fois en mémoire, et il n'est pas nécessaire de créer un nouvel objet pour qu'il soit créé et utilisable.
Un membre d'instance est déclaré sans le mot clé static. Il n'est créé que pour chaque objet (une instance) créé par l'opérateur new.
Exemple :

### Classe statique

Une classe statique ne contient que des membres statiques, et ne peut être instanciée. Le mot clé static précède la déclaration de cette classe.
Exemple :

### Instance d'une classe

L'instance d'une classe est aussi appelée un objet. Une variable de ce type est un type référence, c'est à dire que la référence est nulle par défaut. Il faut donc utiliser le mot clé new pour allouer une instance de la classe.
Exemple :
Le mot clé new est suivi du nom de la classe et d'une liste de paramètres entre parenthèses. Il s'agit en fait d'un appel au constructeur (abordé plus loin dans ce chapitre) initialisant l'objet créé.

### La référence nulle

Toute variable de type objet est en fait une référence initialisée à null par défaut. Cette référence peut être utilisée quel que soit le type d'objet.
Il est souvent nécessaire de tester si la référence est nulle avant d'accéder à un membre de l'objet référencé. Si le test n'est pas fait et que la référence est nulle, une exception est levée.

## Niveaux de protection

Le niveau de protection est spécifié par un mot clé placé avant la déclaration d'une classe ou d'un membre de classe (attribut, méthode, propriété, ...) :

### public

    Accès autorisé à tous ;

### private

    Accès depuis la classe seulement ;

### protected

    Accès depuis la classe et ses sous-classes seulement ;

### internal

    Accès depuis l'assembly seulement.
Exemple :
En général, les règles de l'encapsulation sont les suivantes :
* Toute méthode est publique, à moins qu'elle ne soit destinée à être exclusivement appelée dans la classe, auquel cas est peut être privée ou protégée,
* Les attributs sont privés. Si un accès est nécessaire, il faut ajouter des méthodes d'accès («accesseurs»), voire une propriété.

## Constructeur

Un constructeur est une méthode spéciale portant le nom de la classe, ne retournant aucune valeur, chargée d'initialiser l'instance. Un constructeur peut avoir des paramètres permettant de définir les valeurs initiales des attributs du nouvel objet.
Une classe possède souvent plusieurs constructeurs. Chacun possédant une liste d'arguments différente.

### Exemple

Pour initialiser une fraction :
Utilisation :

### Constructeur par défaut

Le constructeur par défaut est celui qui n'a aucun paramètre. Si aucun constructeur n'est déclaré dans une classe, le compilateur crée un constructeur par défaut qui ne fait rien, laissant les attributs à leur valeur par défaut (dépendant du type : 0 pour les numériques, null pour tous les autres).
En fait, ce constructeur par défaut appelle le constructeur sans argument (qu'il soit par défaut ou explicitement implémenté) de la classe de base (System.Object par défaut). Voir le chapitre sur l'héritage de classe.

### Constructeur statique

Il est possible d'exécuter un code lors de la première utilisation de la classe. Cette initialisation peut être vue comme un constructeur statique :