Expression de déconstruction - Extraire les propriétés des champs d’un tuple ou d’un autre type défini par l’utilisateur
Une expression de déconstruction extrait les champs de données d’une instance d’un objet. Chaque élément de données discret est écrit dans une variable distincte, comme illustré dans l’exemple suivant :
var tuple = (X: 1, Y: 2);
var (x, y) = tuple;
Console.WriteLine(x); // output: 1
Console.WriteLine(y); // output: 2
L’extrait de code précédent crée un tuple qui a deux valeurs entières, X
et Y
. La deuxième instruction déconstructe ce tuple et stocke les éléments tuple dans des variables discrètes x
et y
.
Déconstruction de tuple
Tous les types de tuple prennent en charge les expressions de déconstruction. La déconstruction du tuple permet d'extraire tous les éléments du tuple. Si vous ne voulez que certains éléments du tuple, utilisez un rejet pour les membres inutilisés du tuple, comme le montre l'exemple suivant :
var tuple2 = (X: 0, Y: 1, Label: "The origin");
var (x2, _, _) = tuple2;
Dans l’exemple précédent, les membres Y
et label
sont ignorés. Vous pouvez spécifier plusieurs rejets dans la même expression de déconstruction. Vous pouvez utiliser les rejets pour tous les membres du tuple. L’exemple suivant est légal, même s’il n’est pas utile :
var (_, _, _) = tuple2;
Déconstruction des enregistrements
Les types d'enregistrement qui ont un constructeur primaire prennent en charge la déconstruction des paramètres positionnels. Le compilateur synthétise une méthode Deconstruct
qui extrait les propriétés synthétisées à partir de paramètres positionnels dans le constructeur principal. La méthode Deconstruction
synthétisée par le compilateur n’extrait pas les propriétés déclarées en tant que propriétés dans le type d’enregistrement.
Le record
indiqué dans le code suivant déclare deux propriétés positionnelles, SquareFeet
et Address
, ainsi qu’une autre propriété, RealtorNotes
:
public record House(int SquareFeet, string Address)
{
public required string RealtorNotes { get; set; }
}
Lorsque vous déconstructez un objet House
, toutes les propriétés positionnelles et uniquement les propriétés positionnelles sont déconstructées, comme illustré dans l’exemple suivant :
var house = new House(1000, "123 Coder St.")
{
RealtorNotes = """
This is a great starter home, with a separate room that's a great home office setup.
"""
};
var (squareFeet, address) = house;
Console.WriteLine(squareFeet); // output: 1000
Console.WriteLine(address); // output: 123 Coder St.
Console.WriteLine(house.RealtorNotes);
Vous pouvez utiliser ce comportement pour spécifier les propriétés de vos types d’enregistrements qui font partie de la méthode Deconstruct
synthétisée par le compilateur.
Déclarer Deconstruct
méthodes
Vous pouvez ajouter la prise en charge de la déconstruction à n’importe quelle classe, struct ou interface que vous déclarez. Vous déclarez une ou plusieurs méthodes Deconstruct
dans votre type, ou en tant que méthodes d'extension de ce type. Une expression de déconstruction appelle une méthode void Deconstruct(out var p1, ..., out var pn)
. La méthode Deconstruct
peut être une méthode d’instance ou une méthode d’extension. Le type de chaque paramètre de la méthode Deconstruct
doit correspondre au type de l’argument correspondant dans l’expression de déconstruction. L’expression de déconstruction affecte la valeur de chaque argument à la valeur du paramètre out
correspondant dans la méthode Deconstruct
. Si plusieurs méthodes Deconstruct
correspondent à l’expression de déconstruction, le compilateur signale une erreur pour l’ambiguïté.
Le code suivant déclare un struct Point3D
qui a deux méthodes Deconstruct
:
public struct Point3D
{
public int X { get; set; }
public int Y { get; set; }
public int Z { get; set; }
public void Deconstruct(out int x, out int y, out int z)
{
x = X;
y = Y;
z = Z;
}
public void Deconstruct(out int x, out int y)
{
x = X;
y = Y;
}
}
La première méthode prend en charge les expressions de déconstruction qui extraient les trois valeurs d’axe : X
, Y
et Z
. La deuxième méthode prend en charge la déconstruction uniquement des valeurs planaires : X
et Y
. La première méthode a une arité de 3 ; la seconde a une arité de 2.
La section précédente a décrit la méthode Deconstruct
synthétisée du compilateur pour les types record
avec un constructeur principal. Vous pouvez déclarer d’autres méthodes Deconstruct
dans les types d’enregistrements. Ces méthodes peuvent ajouter d’autres propriétés, supprimer certaines des propriétés par défaut ou les deux. Vous pouvez également déclarer une Deconstruct
qui correspond à la signature synthétisée du compilateur. Si vous déclarez une telle méthode Deconstruct
, le compilateur ne synthétise pas celui-ci.
Plusieurs méthodes Deconstruct
sont autorisées tant que le compilateur peut déterminer une méthode Deconstruct
unique pour une expression de déconstruction. En règle générale, plusieurs méthodes Deconstruct
pour le même type ont différents nombres de paramètres. Vous pouvez également créer plusieurs méthodes Deconstruct
qui diffèrent selon les types de paramètres. Toutefois, dans de nombreux cas, trop de méthodes Deconstruct
peuvent entraîner des erreurs d’ambiguïté et des résultats trompeurs.
Spécification du langage C#
Pour plus d'informations, voir la section sur la déconstruction de la norme C#.