2012-11-30 13 views
105

Qualcuno potrebbe spiegare cos'è una Tupla e come usarla in uno scenario del mondo reale. Mi piacerebbe scoprire come questo può arricchire la mia esperienza di codifica?Cosa e quando usare la tupla?

risposta

108

Questo msdn article spiega molto bene con esempi, "Una tupla è una struttura di dati che ha un numero specifico e sequenza di elementi".

tuple sono comunemente usati in quattro modi:

  1. per rappresentare un singolo insieme di dati. Ad esempio, una tupla può rappresentare un record di database e i suoi componenti possono rappresentare singoli campi del record.

  2. Per fornire un facile accesso e manipolazione di un set di dati.

  3. Per restituire più valori da un metodo senza utilizzare i parametri (in C#) o ByRef (in Visual Basic).

  4. Per passare più valori a un metodo attraverso un singolo parametro. Per esempio , il metodo Thread.Start(Object) ha un singolo parametro che consente di fornire un valore al metodo che il thread esegue al tempo di avvio . Se si fornisce un oggetto Tuple<T1, T2, T3> come argomento metodo , è possibile fornire la routine di avvio del thread con tre elementi di dati.

68

Una tupla consente di combinare più valori possibilmente diversi tipi in un unico oggetto senza dover creare una classe personalizzata. Questo può essere utile se vuoi scrivere un metodo che per esempio restituisce tre valori correlati ma non vuoi creare una nuova classe.

Generalmente si consiglia di creare una classe in quanto consente di assegnare nomi utili a ciascuna proprietà. Il codice che utilizza ampiamente tuple rapidamente diventare illeggibile perché le proprietà sono chiamati Item1, Item2, Item3, ecc ..

+28

Io lo uso al massimo per 2 valori e ciascuno di tipo diverso, ad es. Stringa, int. Altrimenti sta diventando il peggior codice che puoi scrivere. – Ondra

+3

Mantenere l'uso limitato, forse preferendo usarlo solo privatamente all'interno di una classe/modulo. Inoltre, l'utilizzo di Tuple che contiene tipi complessi ("Cliente", "Dipendente", ecc.) Può essere un po 'più semplice delle primitive. Niente è peggio di provare a lavorare con un sacco di Tuple s. –

16

classi tuple consentono agli sviluppatori di essere 'rapido e pigro' non definendo una classe specifica per un uso specifico.

I nomi di proprietà sono Item1, Item2, Item3 ..., che potrebbe non essere significativo in alcuni casi o senza documentazione.

Le classi di tupla hanno parametri generici fortemente tipizzati. Ancora utenti delle classi Tuple possono dedurre dal tipo di parametri generici.

+1

Quindi forse C# 7 avrebbe dovuto rendere più semplice la creazione di classi/oggetti al volo invece di questa cosa tupla? –

32

La differenza tra una tupla e una classe è che una tupla non ha nomi di proprietà. Questa non è quasi mai una buona cosa, e utilizzerei solo una tupla quando gli argomenti sono abbastanza privi di significato come in una formula matematica astratta. il calcolo astratto su 5,6, 7 dimensioni potrebbe richiedere una tupla per le coordinate.

+1

In questo caso (dove probabilmente i tipi di valori sono gli stessi) utilizzando un array semplice non è sufficiente? C'è qualche vantaggio nell'usare una tupla? –

+0

I tipi potrebbero altrettanto facilmente essere diversi, ma suppongo che l'implementazione di IComparable potrebbe essere un vantaggio nel caso omogeneo a volte. Come dici tu, sarei propenso a usare un array per scenari più semplici. – Kaido

+0

Risposta molto bella! –

20

Questa è la cosa più importante da sapere sul tipo di tupla. Tuple è una classe, non una struttura. Sarà quindi assegnato all'heap gestito. Ogni istanza di classe assegnata si aggiunge all'onere della garbage collection.

Nota: Le proprietà Elemento1, Elemento2 e inoltre non hanno setter. Non puoi assegnarli. La Tuple è immutabile una volta creata in memoria.

+1

_ "Burden" _ - hai mai osservato un problema di garbage collection? – Gusdor

+3

Assolutamente! Pensa al codice di elaborazione delle comunicazioni di rete. Sta allocando e deallocando tonnellate di memoria in modo che ogni due minuti il ​​GC sia in esecuzione e potrebbero essere necessari alcuni secondi. Ciò è inaccettabile se qualcosa a valle si basa su tali dati in tempo reale. Un altro esempio è un dispositivo con limitazioni di risorse, ad esempio un dispositivo mobile, che esegue un'app in tempo reale, ad esempio un'app delle indicazioni stradali. – stuckintheshuck

Problemi correlati