Blog ENI : Toute la veille numérique !
💥 Un livre PAPIER acheté
= La version EN LIGNE offerte pendant 1 an !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. C# 12
  3. La création de types
Extrait - C# 12 Développez des applications Windows avec Visual Studio 2022
Extraits du livre
C# 12 Développez des applications Windows avec Visual Studio 2022
1 avis
Revenir à la page d'achat du livre

La création de types

Introduction

Les classes représentent la majorité des types référence. La définition la plus simple d’une classe sera :

class MaClasse 
{ 
} 

Au fur et à mesure de la construction d’une classe, des éléments sont ajoutés :

  • Les membres (méthodes, propriétés, indexeurs, événements...) sont placés entre les accolades.

  • Les attributs et les modificateurs de classe comme le niveau d’accès sont placés avant le mot-clé class.

  • L’héritage et les implémentations d’interfaces sont placés après le nom de la classe.

Les niveaux d’accès

Les niveaux d’accès permettent de définir comment vont pouvoir s’effectuer l’instanciation des types et l’appel des méthodes. Le niveau d’accès est défini à l’aide de mots-clés précédant la déclaration de la classe, ou du membre. Le tableau suivant présente les modificateurs d’accès disponibles :

Modificateur d’accès

Description

public

Autorise l’accès pour tous les types de l’assemblage et hors de l’assemblage.

private

Autorise l’accès uniquement pour les autres membres du type.

internal

Autorise l’accès pour tous les types de l’assemblage uniquement.

protected

Autorise l’accès uniquement pour les autres membres du type ou pour les types héritant de celui-ci même en dehors de l’assemblage.

protected internal

Autorise l’accès uniquement pour les autres membres du type ou pour les types héritant de celui-ci dans l’assemblage uniquement.

file

Autorise l’accès pour tous les types définis dans le même fichier uniquement.

Si aucun modificateur d’accès n’est précisé sur un membre, il est considéré comme private. Une classe ou une structure sans modificateur d’accès sera considérée comme...

Les structures

Les structures sont très similaires aux classes avec, comme principales différences, le fait qu’une structure est un type valeur alors qu’une classe est un type référence. Les structures sont utilisées à la place des classes quand la sémantique exige un type valeur. Une structure ne supporte pas l’héritage. Elles peuvent posséder tous les membres d’une classe à l’exception d’un constructeur sans paramètre, d’un destructeur et de membres virtuels.

Voici l’exemple de la définition d’une structure :

struct GeoPoint 
{ 
    double Longitude; 
    double Latitude; 
} 

La déclaration et l’instanciation d’une occurrence de la structure se font comme pour une classe. Un constructeur sans paramètre existe implicitement :

GeoPoint g = new GeoPoint(); 

Il est possible de surcharger ce constructeur pour initialiser les membres de la structure mais il faut noter que, lors de l’utilisation du mot-clé default, l’initialisation affectera les valeurs par défaut des types aux membres (dans l’exemple ci-dessous, 0 pour les types double) :

public GeoPoint() 
{  
    this.Longitude = 1;  
    this.Latitude = 2;  
} 
  var...

Les classes

1. Les champs

Un champ est une variable qui est un membre de la classe. Il peut s’agir de type valeur ou de type référence.

 À la racine du projet, créez un dossier nommé Library et créez une nouvelle classe nommée Project. Ajoutez les champs suivants :

public class Project 
{ 
    protected string filename = "sans titre.smpx", path; 
    protected DataTable data = new DataTable(); 
    protected bool hasChanged; 
} 

Les champs peuvent être initialisés au moment de la déclaration. Un champ qui n’est pas initialisé explicitement recevra les valeurs par défaut suivant son type. L’initialisation des champs est effectuée avant l’exécution du constructeur de la classe.

Il est également possible de déclarer et initialiser plusieurs champs en une seule instruction s’ils ont le même niveau d’accès et le même type :

private string filename = "sans titre.smpx", path; 

Le mot-clé readonly permet de spécifier qu’un champ sera en lecture seule, il pourra seulement être assigné lors de la déclaration ou lors de l’instanciation, au sein du constructeur :

public readonly int i = 1; 

2. Les propriétés

Les propriétés ressemblent à des champs puisqu’on y accède de la même manière mais leur logique interne les rapproche des méthodes.

Une propriété est déclarée de la même manière qu’un champ en ajoutant des blocs get et set. Ces deux blocs sont appelés des accesseurs ; l’accesseur get est exécuté lorsque la propriété est lue et doit retourner une valeur du type de la propriété. L’accesseur set est exécuté lorsque la propriété est assignée. Un paramètre implicite accessible via le mot-clé value du type de la propriété est fourni.

 Utilisez les outils de refactorisation de Visual Studio ([Ctrl] R, E avec le curseur sur le nom d’un champ) pour générer les propriétés des champs précédemment créés dans la classe...

Les records

Un record représente un objet immuable. Il suffit de définir la classe avec le mot-clé record et des paramètres :

public record Personne(string Prenom, string Nom) ; 

Lors de la compilation, cette ligne est traduite en une classe avec deux propriétés immuables, un constructeur avec deux paramètres, un constructeur par copie, un destructeur.

L’instanciation d’un record se fait de la même manière qu’une classe. Il suffit d’utiliser le constructeur fourni :

Personne p = new Personne("Jérôme", "Hugon"); 

Il est également possible d’utiliser le constructeur par copie avec le mot-clé with :

Personne e = p with { Prenom = "Anthony" }; 

Si le type de record (class ou struct) n’est pas précisé, le compilateur créera par défaut un record de type référence, donc une classe. Pour créer un record de type valeur, soit une structure, il faut combiner le mot-clé record avec le mot-clé struct :

public record struct Vector(int X, int y); 

Pour plus de clarté, le mot-clé class peut être explicitement spécifié :

public record class Personne(string Prenom, string Nom) ;