Programmation orientée objet

Encapsulation

L’encapsulation est parfois considérée comme le premier pilier ou principe de la programmation orientée objet. D'après le principe d'encapsulation, 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 à partir de l’extérieur de la classe ou de l’assembly peuvent être masquées pour limiter le risque d’erreurs de codage ou d’exploitation malveillante. Pour plus d’informations, consultez programmation orientée objet.

Membres

Tous les champs, méthodes, constantes, propriétés et événements doivent être déclarés dans un type ; ils sont appelés membres du type. 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 Main méthode, doit être déclaré dans une classe ou un struct (implicitement dans le cas d' instructions de niveau supérieur).

La liste suivante répertorie tous les différents 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

Accessibilité

Certaines méthodes et propriétés sont censées être appelées ou accessibles à partir du code 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 l’accessibilité de vos types et de leurs membres 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 (la classe de base) contient automatiquement tous les membres publics, protégés et internes de la classe de base, sauf ses constructeurs et finaliseurs. Pour plus d’informations, consultez les pages Héritage et Polymorphisme.

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.

Interfaces

Les classes, les structs et les enregistrements peuvent hériter de plusieurs interfaces. Pour un type, hériter d’une interface signifie implémenter toutes les méthodes définies dans l’interface. Pour plus d'informations, consultez Interfaces.

Types génériques

Les classes, les structs et les 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 List<T> classe de l' System.Collections.Generic espace de noms est définie avec un 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 ou 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 new mot clé. 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.

Types imbriqués

Une classe, un struct ou un enregistrement peut être imbriqué dans une autre classe, structure ou enregistrement.

Types partiels

Vous pouvez définir une partie d’une classe, d’une structure ou d’une méthode dans un fichier de code et une autre partie dans un fichier de code séparé.

Initialiseurs d'objets

Vous pouvez instancier et initialiser des objets de classe et de struct, ainsi que des collections d'objets, sans appeler explicitement leur constructeur.

Types anonymes

Dans les situations où il n’est pas pratique ou nécessaire de créer une classe nommée, par exemple lorsque vous remplissez une liste avec des structures de données que vous n’avez pas à conserver ou à passer à une autre méthode, vous utilisez des types anonymes.

Méthodes d’extension

Vous pouvez « étendre » une classe sans créer de classe dérivée en créant un type séparé dont les méthodes peuvent être appelées comme si elles appartenaient au type d’origine.

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.

Enregistrements

C# 9 introduit le record type, un type de 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 l’encapsulation des données dans des types immuables. Un enregistrement fournit les fonctionnalités suivantes :

  • Syntaxe concise pour créer un type référence avec des propriétés immuables.

  • Égalité des valeurs.

    Deux variables d’un type d’enregistrement sont égales si les définitions de type d’enregistrement sont identiques et, si pour chaque champ, les valeurs des deux enregistrements sont égales. Cela diffère des classes, qui 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 la mutation non destructrice.

    Une with expression vous permet de créer une nouvelle instance d’enregistrement qui est une copie d’une instance existante, mais dont les valeurs de propriété spécifiées sont modifiées.

  • Mise en forme intégrée pour l’affichage.

    La ToString méthode 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.

    L’héritage est pris en charge, car un enregistrement est une classe en coulisses, et non un struct.

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.