Condividi tramite


Espressione di decostruzione - Estrarre le proprietà dei campi da una tupla o da un altro tipo definito dall'utente

Espressione di decostruzione estrae campi dati da un'istanza di un oggetto . Ogni elemento dati discreto viene scritto in una variabile distinta, come illustrato nell'esempio seguente:

var tuple = (X: 1, Y: 2);
var (x, y) = tuple;

Console.WriteLine(x); // output: 1
Console.WriteLine(y); // output: 2

Il frammento di codice precedente crea una tupla con due valori interi, X e Y. La seconda istruzione decostruisce che tupla e archivia gli elementi della tupla in variabili discrete x e y.

Decostruzione della tupla

Tutti i tipi di tupla supportano espressioni di decomposizione. La decostruzione di una tupla estrae tutti i suoi elementi. Se si desidera solo alcuni degli elementi della tupla, usare un eliminare per i membri della tupla inutilizzata, come illustrato nell'esempio seguente:

var tuple2 = (X: 0, Y: 1, Label: "The origin");
var (x2, _, _) = tuple2;

Nell'esempio precedente i membri Y e label vengono eliminati. È possibile specificare più scarti nella stessa espressione di decostruzione. Puoi usare gli scarti per tutti i membri della tupla. L'esempio seguente è valido, anche se non utile:

var (_, _, _) = tuple2;

Decostruzione dei record

Tipi di record con un costruttore primario supportano la decostruzione per i parametri posizionali. Il compilatore sintetizza un metodo Deconstruct che estrae le proprietà sintetizzate dai parametri posizionali nel costruttore primario. Il metodo Deconstruction sintetizzato dal compilatore non estrae le proprietà dichiarate come proprietà nel tipo di record.

Il record illustrato nel codice seguente dichiara due proprietà posizionali, SquareFeet e Address, insieme a un'altra proprietà RealtorNotes:

public record House(int SquareFeet, string Address)
{
    public required string RealtorNotes { get; set; }
}

Quando si decostruisce un oggetto House, tutte le proprietà posizionale e solo le proprietà posizionale vengono decostruite, come illustrato nell'esempio seguente:

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);

È possibile utilizzare questo comportamento per specificare quali proprietà dei tipi di record fanno parte del metodo Deconstruct sintetizzato dal compilatore.

Dichiarare i metodi di Deconstruct

È possibile aggiungere il supporto per la decostruzione a qualsiasi classe, struct o interfaccia dichiarata. Si dichiarano uno o Deconstruct metodi nel tipo o come metodi di estensione su tale tipo. Un'espressione di decomposizione chiama un metodo void Deconstruct(out var p1, ..., out var pn). Il metodo Deconstruct può essere un metodo di istanza o un metodo di estensione. Il tipo di ogni parametro nel metodo Deconstruct deve corrispondere al tipo dell'argomento corrispondente nell'espressione di decostruzione. L'espressione di decostruzione assegna il valore di ogni argomento al valore del parametro out corrispondente nel metodo Deconstruct. Se più metodi Deconstruct corrispondono all'espressione di decostruzione, il compilatore segnala un errore per l'ambiguità.

Il codice seguente dichiara uno struct Point3D con due metodi 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;
    }
}

Il primo metodo supporta espressioni di decostruzione che estraggono tutti e tre i valori dell'asse: X, Ye Z. Il secondo metodo supporta la decostruzione solo dei valori planari: X e Y. Il primo metodo ha un arity di 3; il secondo ha un'arità di 2.

Nella sezione precedente è stato descritto il metodo di Deconstruct sintetizzato dal compilatore per i tipi record con un costruttore primario. È possibile dichiarare più metodi Deconstruct nei tipi di record. Questi metodi possono aggiungere altre proprietà, rimuovere alcune delle proprietà predefinite o entrambe. È anche possibile dichiarare un Deconstruct che corrisponde alla firma sintetizzata dal compilatore. Se si dichiara un metodo Deconstruct di questo tipo, il compilatore non ne esegue la sintesi.

Sono consentiti più metodi Deconstruct, purché il compilatore possa determinare un metodo Deconstruct univoco per un'espressione di decostruzione. In genere, più metodi di Deconstruct per lo stesso tipo hanno numeri diversi di parametri. È anche possibile creare più metodi Deconstruct che differiscono in base ai tipi di parametro. Tuttavia, in molti casi, troppi metodi Deconstruct possono causare errori di ambiguità e risultati fuorvianti.

Specifica del linguaggio C#

Per ulteriori informazioni, consultare la sezione di decostruzione dello standard C# .

Vedere anche