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
, Y
e 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# .