Partager via


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, Yet 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#.

Voir aussi