Quali sono i casi d'uso appropriati per scrivere i propri decostruttori in C # 7?

3

C # 7 ha una nuova funzionalità linguistica: lo structor De con . Ad esempio, è possibile utilizzarlo per le tuple valore. Tuttavia, posso anche creare i miei decostruttori per le mie classi. Perchè dovrei farlo? Le mie classi hanno proprietà. Quindi è possibile accedere comunque a singoli articoli.

    
posta Daan 14.05.2017 - 00:13
fonte

2 risposte

5

La decostruzione offre una notevole brevità e chiarezza rispetto all'alternativa tradizionale e fornisce supporto per uno stile di programmazione completamente funzionale.

Considera questo semplice esempio di decostruttore su una riga di Microsoft:

var (first, middle, last) = LookupName(id1); 

Per fare la stessa cosa nel tradizionale modo orientato agli oggetti, dovresti scrivere un codice che assomigli a questo:

class Name
{
    public string First { get; set; }
    public string Middle { get; set; }
    public string Last { get; set; }
}
var name = someObject.LookupName(id1);

var first = name.First;
var middle = name.Middle;
var last = name.Last;

Anche se hai restituito una tupla, sarebbero comunque necessarie 4 righe di codice e perderai la mappatura del nome della tua proprietà:

var name = someObject.LookupName(id1);

var first = name.Item1;
var middle = name.Item2;
var last = name.Item3;
    
risposta data 14.05.2017 - 03:28
fonte
2

"Use cases" è una verbosità un po 'strana per la domanda. Questo non ti permette davvero di fare nulla che non potresti mai fare prima. In alcuni casi è semplicemente più ordinato.

L'unica cosa importante che posso pensare è che ti dà un controllo limitato in fase di compilazione. Ad esempio, supponi di avere una classe UsAddress . Hai linea 1, linea 2, città, stato e zip. Puoi decostruire in variabili var (line1, line2, city, state, zip) = ObtainAddress() . Ora supponiamo di voler aggiungere una linea 3. Questo punto sarà ora un errore di compilazione perché non corrisponde al decostruttore e puoi valutare cosa devi fare sulla linea 3 in ogni sito di chiamata. L'alternativa sarebbe:

var address = ObtainAddress();
var line1 = address.Line1;
// ...

In questo caso, non ci sarebbe alcun errore di compilazione per il nuovo campo. Che sia buono o meno è, ovviamente, il suo dibattito.

Molte delle idee introdotte in C # 6 e 7 sono state la lucidatura e l'attenuazione dei punti deboli e sembra che molte persone si siano lamentate della mancanza di un supporto di prima classe per le tuple nella lingua. Quindi non è tanto il "caso d'uso" quanto lo zucchero sintattico.

    
risposta data 15.05.2017 - 22:31
fonte

Leggi altre domande sui tag