Partager via


Créer des types en C#

Ce tutoriel vous apprend à créer des types en C#. Vous écrivez de petites quantités de code, puis vous compilez et exécutez ce code. Le tutoriel contient une série de leçons qui explorent différents types de types en C#. Ces leçons vous enseignent les principes fondamentaux de la langue C#.

Conseil / Astuce

Lorsqu’un bloc d’extrait de code inclut le bouton « Exécuter », ce bouton ouvre la fenêtre interactive ou remplace le code existant dans la fenêtre interactive. Lorsque l’extrait de code n’inclut pas de bouton « Exécuter », vous pouvez copier le code et l’ajouter à la fenêtre interactive active.

Les didacticiels précédents ont fonctionné avec du texte et des nombres. Les chaînes et les nombres sont des types simples : ils stockent chacun une valeur unique. À mesure que vos programmes augmentent, vous devez travailler avec des structures de données plus sophistiquées. C# fournit différents types de types que vous pouvez définir lorsque vous avez besoin de structures de données avec plus de champs, de propriétés ou de comportement. Commençons à explorer ces types.

Tuples

Les tuples sont une séquence ordonnée de valeurs avec une longueur fixe. Chaque élément d’un tuple a un type et un nom facultatif. Le code suivant déclare un tuple qui représente un point 2D. Sélectionnez le bouton « Exécuter » pour coller le code suivant dans la fenêtre interactive et l’exécuter.

var pt = (X: 1, Y: 2);

var slope = (double)pt.Y / (double)pt.X;
Console.WriteLine($"A line from the origin to the point {pt} has a slope of {slope}.");

Conseil / Astuce

Lorsque vous explorez C# (ou tout langage de programmation), vous faites des erreurs lorsque vous écrivez du code. Le compilateur trouve ces erreurs et les signale à vous. Lorsque la sortie contient des messages d’erreur, examinez attentivement l’exemple de code et le code dans la fenêtre interactive pour voir ce qu’il faut corriger. Cet exercice vous aide à apprendre la structure du code C#.

Vous pouvez réaffecter n'importe quel membre d'un tuple. Ajoutez le code suivant dans la fenêtre interactive après le code existant. Appuyez de nouveau sur « Exécuter » pour afficher les résultats.

pt.X = pt.X + 5;
Console.WriteLine($"The point is now at {pt}.");

Vous pouvez également créer un nouveau tuple qui est une copie modifiée de l’original en utilisant une expression with. Ajoutez le code suivant après le code déjà dans la fenêtre interactive et appuyez sur « Exécuter » pour afficher les résultats :

var pt2 = pt with { Y = 10 };
Console.WriteLine($"The point 'pt2' is at {pt2}.");

Le tuple pt2 contient la X valeur ( pt 6) et pt2.Y est 10.

Les tuples sont des types structurels. En d’autres termes, les types tuples n’ont pas de noms comme string ou int. Un type de tuple est défini par le nombre de membres, appelé arité, et les types de ces membres. Les noms des membres sont pratiques. Vous pouvez assigner un tuple à un tuple de même arité et de même type, même si les membres ont des noms différents. Vous pouvez ajouter le code suivant après le code que vous avez déjà écrit dans la fenêtre interactive et essayer :

var subscript = (A: 0, B: 0);
subscript = pt;
Console.WriteLine(subscript);

La variable subscript a deux membres, dont les deux sont des entiers. Les deux subscript et pt représentent les instances du même type de tuple : un tuple contenant 2 int membres.

Les tuples sont faciles à créer : vous déclarez plusieurs membres entre parenthèses. Tous les éléments suivants déclarent des tuples différents, avec des arities et des types de membres différents. Ajoutez le code suivant pour créer de nouveaux types de tuples :

var namedData = (Name: "Morning observation", Temp: 17, Wind: 4);
var person = (FirstName: "", LastName: "");
var order = (Product: "guitar picks", style: "triangle", quantity: 500, UnitPrice: 0.10m);

Les tuples sont faciles à créer, mais leurs capacités sont limitées. Les types tuples n’ont pas de noms. Vous ne pouvez donc pas transmettre de signification à l’ensemble de valeurs. Les types de tuple ne peuvent pas ajouter de comportement. C# a d’autres types de types que vous pouvez créer lorsque votre type définit le comportement.

Créer des types d’enregistrements

Les tuples sont parfaits pour les cas où vous avez besoin de plusieurs valeurs dans la même structure. Ils sont légers et peuvent être déclarés à mesure qu’ils sont utilisés. Au fur et à mesure que votre programme progresse, vous remarquerez que vous utilisez le même type de tuple tout au long de votre code. Si votre application fonctionne dans l’espace graphique 2D, les tuples qui représentent des points peuvent être courants. Une fois que vous avez trouvé cela, vous pouvez déclarer un record type qui stocke ces valeurs et fournit plus de fonctionnalités. L’exemple de code suivant utilise une Main méthode pour représenter le point d’entrée du programme. De cette façon, vous pouvez déclarer un record type précédant le point d’entrée dans le code. Appuyez sur le bouton « Exécuter » sur le code suivant pour remplacer votre exemple existant par le code suivant.

Avertissement

Ne pas copier-coller. La fenêtre interactive doit être réinitialisée pour exécuter l’exemple suivant. Si vous faites une erreur, la fenêtre se bloque et vous devez actualiser la page pour continuer.

Le code suivant déclare et utilise un record type pour représenter un Point, puis utilise cette Point structure dans la Main méthode :

public record Point(int X, int Y);

public static void Main()
{
    Point pt = new Point(1, 1);
    var pt2 = pt with { Y = 10 };
    Console.WriteLine($"The two points are {pt} and {pt2}");
}

La record déclaration est une seule ligne de code pour le Point type qui stocke les valeurs X et Y dans les propriétés en lecture seule. Vous utilisez le nom Point partout où vous employez ce type. Les types correctement nommés, tels que Point, fournissent des informations sur la façon dont le type est utilisé. La Main méthode montre comment utiliser une with expression pour créer un point qui est une copie modifiée du point existant. La ligne pt2 = pt with { Y = 10 } indique «pt2 a les mêmes valeurs que pt, à l'exception de Y qui est affecté à 10». Vous pouvez ajouter n'importe quel nombre de propriétés à modifier dans une seule expression with.

La déclaration précédente record est une seule ligne de code qui se termine par ;, comme toutes les instructions C#. Vous pouvez ajouter un comportement à un type record en déclarant des membres. Un membre d'enregistrement peut être une fonction ou plusieurs éléments de données. Les membres d’un type se trouvent dans la déclaration de type, entre { et } caractères. Remplacez la déclaration d’enregistrement que vous avez faite par le code suivant :

public record Point(int X, int Y)
{
    public double Slope() => (double)Y / (double)X;
}

Ensuite, ajoutez le code suivant à la Main méthode après la ligne contenant l’expression with :

double slope = pt.Slope();
Console.WriteLine($"The slope of {pt} is {slope}");

Vous avez ajouté de la formalité au tuple représentant une valeur X et une valeur Y. Vous en avez fait un record qui définit un type nommé et inclut un membre pour calculer la pente. Un type record est une abréviation pour un type record class : un type class qui inclut un comportement supplémentaire. Vous pouvez également modifier le Point type pour le rendre ainsi record struct :

public record struct Point(int X, int Y)
{
    public double Slope() => (double) Y / (double) X;
}

Un record struct est un type de struct qui inclut le comportement supplémentaire ajouté à tous les types de record.

Struct, classe et types d’interface

Tous les types nommés en C# sont soit de type class, soit de type struct. A class est un type de référence. Un struct est un type de valeur. Les variables d’un type valeur stockent le contenu de l’instance inline en mémoire. En d’autres termes, un record struct Point stocke deux entiers : X et Y. Les variables d’un type référence stockent une référence ou un pointeur vers le stockage de l’instance. En d'autres termes, un(e) record class Point stocke une référence à un bloc de mémoire qui contient les valeurs de X et Y.

Dans la pratique, cela signifie que les types valeur sont copiés lorsqu’ils sont attribués, mais qu’une copie d’une instance de classe est une copie de la référence. Cette référence copiée fait référence à la même instance d’un point, avec le même stockage pour X et Y.

Le modificateur record demande au compilateur d'écrire plusieurs membres pour vous. Vous pouvez en savoir plus dans l’article sur les types d’enregistrements dans la section notions de base.

Lorsque vous déclarez un record type, vous déclarez que votre type doit utiliser un ensemble de comportements par défaut pour les comparaisons d’égalité, l’affectation et la copie d’instances de ce type. Les enregistrements sont le meilleur choix lorsque le stockage de données connexes est la principale responsabilité de votre type. Lorsque vous ajoutez d’autres comportements, envisagez d’utiliser struct ou class de types, sans le record modificateur.

Vous utilisez struct pour les types de valeur quand un comportement plus sophistiqué est nécessaire, mais la responsabilité principale consiste à stocker des valeurs. Vous utilisez class des types pour utiliser des idiomes orientés objet tels que l’encapsulation, l’héritage et le polymorphisme.

Vous pouvez également définir des interface types pour déclarer des contrats comportementaux que différents types doivent implémenter. Les types struct et class peuvent implémenter des interfaces.

Vous utilisez généralement tous ces types dans des programmes et bibliothèques plus volumineux. Une fois que vous avez installé le Kit de développement logiciel (SDK) .NET, vous pouvez explorer ces types à l’aide de didacticiels sur les classes de la section notions de base.

Vous avez terminé le didacticiel interactif « Créer des types en C# ». Vous pouvez sélectionner le lien Branches et boucles pour démarrer le tutoriel interactif suivant, ou vous pouvez visiter le site .NET pour télécharger le Kit de développement logiciel (SDK) .NET, créer un projet sur votre ordinateur et continuer à coder. La section « Étapes suivantes » vous ramène à ces didacticiels.

Vous pouvez en savoir plus sur les types en C# dans les articles suivants :