Vue d’ensemble des classes, des structs et des enregistrements en C#

En C#, la définition d’un type (classe, struct ou enregistrement) ressemble à un blueprint qui spécifie ce que le type peut faire. Un objet est fondamentalement un bloc de mémoire qui a été alloué et configuré selon le plan. Cet article fournit une vue d’ensemble de ces blueprints et de leurs fonctionnalités. L’article suivant de cette série présente les objets.

Encapsulation

L’encapsulation est parfois considérée comme le premier pilier ou principe de la programmation orientée objet. Une classe ou un struct peut spécifier le degré d'accessibilité de chacun de ses membres au code situé en dehors de la classe ou du struct. Les méthodes et variables qui ne sont pas destinées à être utilisées depuis l’extérieur de la classe ou de l’assembly peuvent être masquées afin de limiter le risque d’erreurs ou de code malveillant exploitant une faille de sécurité. Pour plus d’informations, consultez le didacticiel Programmation orientée objet.

Membres

Les membres d’un type incluent toutes les méthodes, champs, constantes, propriétés et événements. En C#, il n’existe aucune variable ou méthode globale, à la différence d’autres langages. Même le point d’entrée d’un programme, la méthode Main, doit être déclaré dans une classe ou un struct (implicitement lorsque vous utilisez des instructions de niveau supérieur).

La liste suivante inclut tous les types de membres qui peuvent être déclarés dans une classe, un struct ou un enregistrement.

  • Champs
  • Constantes
  • Propriétés
  • Méthodes
  • Constructeurs
  • Événements
  • Finaliseurs
  • Indexeurs
  • Opérateurs
  • Types imbriqués

Pour plus d’informations, consultez Membres.

Accessibilité

Certaines méthodes et propriétés sont censées être appelées ou accessibles à partir du code situé en dehors d’une classe ou d’un struct, connu sous le nom de code client. D’autres méthodes et propriétés peuvent être uniquement utilisables dans la classe ou le struct proprement dits. Il est important de limiter l’accessibilité de votre code afin que seul le code client prévu puisse y accéder. Vous spécifiez la façon dont vos types et leurs membres sont accessibles au code client à l’aide des modificateurs d’accès suivants :

L’accessibilité par défaut est private.

Héritage

Les classes (mais pas les structs) prennent en charge le concept d'héritage. Une classe qui dérive d’une autre classe, appelée classe de base, contient automatiquement tous les membres publics, protégés et internes de la classe de base, sauf ses constructeurs et finaliseurs.

Les classes peuvent être déclarées comme abstraites, ce qui signifie qu’une ou plusieurs de leurs méthodes n’ont aucune implémentation. Bien que les classes abstraites ne puissent pas être instanciées directement, elles peuvent servir de classes de base à d’autres classes qui fournissent l’implémentation manquante. Les classes peuvent également être déclarées comme scellées pour empêcher d’autres classes d’hériter d’elles.

Pour plus d’informations, consultez les pages Héritage et Polymorphisme.

Interfaces

Les classes, les structs et les enregistrements peuvent implémenter plusieurs interfaces. L’implémentation à partir d’une interface signifie que le type implémente toutes les méthodes définies dans l’interface. Pour plus d'informations, consultez Interfaces.

Types génériques

Les classes, structs et enregistrements peuvent être définis avec un ou plusieurs paramètres de type. Le code client fournit le type lorsqu’il crée une instance du type. Par exemple, la classe List<T> de l’espace de noms System.Collections.Generic est définie avec un seul paramètre de type. Le code client crée une instance d’une List<string> ou d’une List<int> pour spécifier le type que contiendra la liste. Pour plus d’informations, consultez Génériques.

Types statiques

Les classes (mais pas les structs ni les enregistrements) peuvent être déclarées comme static. Une classe statique ne peut contenir que des membres statiques et ne peut pas être instanciée avec le mot clé new. Une copie de la classe est chargée en mémoire au chargement du programme, et ses membres sont accessibles par le biais du nom de la classe. Les classes, les structs et les enregistrements peuvent contenir des membres statiques. Pour plus d’informations, consultez Classes static et membres de classe static.

Types imbriqués

Une classe, un struct et un enregistrement peuvent être imbriqués dans d’autres classe, struct et enregistrement. Pour plus d’informations, consultez Types imbriqués.

Types partiels

Vous pouvez définir une partie d'une classe, d'un struct ou d'une méthode dans un fichier de code et une autre partie dans un autre fichier de code. Pour plus d’informations, consultez la page Classes et méthodes partielles.

Initialiseurs d'objets

Vous pouvez instancier et initialiser des objets de classe ou de struct, ainsi que des collections d’objets, en affectant des valeurs aux propriétés. Pour plus d’informations, consultez Comment initialiser des objets à l’aide d’un initialiseur d’objet.

Types anonymes

Dans les situations où il n’est pas pratique ou nécessaire de créer une classe nommée, vous utilisez des types anonymes. Les types anonymes sont définis par leurs membres de données nommés. Pour plus d’informations, consultez Types anonymes.

Méthodes d’extension

Vous pouvez « étendre » une classe sans créer de classe dérivée en créant un type distinct. Ce type contient des méthodes qui peuvent être appelées comme si elles appartenaient au type d’origine. Pour plus d’informations, consultez Méthodes d’extension.

Variables locales implicitement typées

Dans une méthode de classe ou de struct, vous pouvez utiliser le typage implicite pour indiquer au compilateur de déterminer le type d’une variable au moment de la compilation. Pour plus d’informations, consultez var (Référence C#).

Enregistrements

C# 9 introduit le type record, un type référence que vous pouvez créer à la place d’une classe ou d’un struct. Les enregistrements sont des classes avec un comportement intégré pour encapsuler des données dans des types immuables. C# 10 introduit le type valeur record struct. Un enregistrement (record class ou record struct) fournit les fonctionnalités suivantes :

  • Syntaxe concise pour la création d’un type référence avec des propriétés immuables.
  • Égalité des valeurs. Deux variables d’un type d’enregistrement sont égales si elles ont le même type et si, pour chaque champ, les valeurs des deux enregistrements sont égales. Les classes utilisent l’égalité de référence : deux variables d’un type de classe sont égales si elles font référence au même objet.
  • Syntaxe concise pour une mutation non destructrice. Une expression with vous permet de créer une nouvelle instance d’enregistrement qui est une copie d’une instance existante, mais avec des valeurs de propriété spécifiées modifiées.
  • Mise en forme intégrée pour l’affichage. La méthode ToString imprime le nom du type d’enregistrement ainsi que les noms et les valeurs des propriétés publiques.
  • Prise en charge des hiérarchies d’héritage dans les classes d’enregistrement. Les classes d’enregistrement prennent en charge l’héritage. Les structs d’enregistrement ne prennent pas en charge l’héritage.

Pour plus d’informations, consultez Enregistrements.

Spécification du langage C#

Pour plus d'informations, voir la spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.