2014-12-18 9 views
6

come è una tupla diversa da una classe? invece del seguente codice, possiamo creare una classe con 3 campi e creare oggetti da essa. Come è diversa questa Tupla? È solo riducendo il codice che scriviamo o ha qualcosa a che fare con la velocità, dato che non è possibile modificare gli elementi in una tupla.come è una tupla diversa da una classe?

Tuple<int, string, bool> tuple = new Tuple<int, string, bool>(1, "cat", true); 
+2

forse vale la pena menzionare, le proprietà sono solo getter, quindi non è possibile cambiarle dopo averle create. – Default

+0

Va notato che le tuple sono * molto * più utili in F #, dove la corrispondenza dei pattern è una grande parte del linguaggio e la sintassi è costruita attorno al concetto: http://msdn.microsoft.com/en-us/ biblioteca/dd233200.aspx. –

+2

Puoi anche controllare il [codice sorgente] (http://referencesource.microsoft.com/#mscorlib/system/tuple.cs,ec6128d1b3907918) per vedere che è solo una classe. –

risposta

13

Si evita di dover definire una nuova classe con proprietà personalizzate.

E fa definisce l'uguaglianza in base al valore dei tre elementi, che è qualcosa che una classe bare-bones non farebbe senza codifica personalizzata. Questo, oltre al fatto che è immutabile, lo rende un candidato ragionevole per una chiave hash in un Dictionary.

Uno svantaggio è che le proprietà sono vaniglia Item1, Item2, ecc, in modo che non fornisce alcuna considerazione dei valori al loro interno, dove le proprietà come ID, Name, Age sarebbe.

+1

Non avrebbero pensato a loro come una buona chiave del dizionario. Naturalmente, devi fare uno * nuovo * per confrontarlo con ... – BradleyDotNET

+1

Un 'Tuple' contenente tipi di valore è in realtà incredibilmente povero da usare come chiave a causa del fatto che la casella 'GetHashCode' e' Equals' ognuno dei valori che contiene! Vedi [questa domanda] (http://stackoverflow.com/questions/21084412/net-tuple-and-equals-performance) per ulteriori informazioni. – Lukazoid

+1

@Lukazoid Fair point, ma stavo confrontando la _pratictical_ del suo utilizzo come chiave rispetto a _performance_. Certamente non è il più performante, ma "Incredibly poor" è un'esagerazione IMHO.Potrebbe non essere significativo a seconda dell'utilizzo. –

10

Tupleè una classe. Uno che contiene tutti i dati desiderati (in proprietà terribilmente denominate come Item1).

È fare le classi invece in modo che il codice sia più leggibile/manutenibile. La sua funzione principale è come una "soluzione rapida" quando si vogliono associare pezzi di dati senza fare una classe per tenerli.

+1

D'accordo, in genere non dovresti usarli. Per le variabili locali puoi invece usare tipi anonimi. Per cose che vengono distribuite è meglio creare tipi separati. – MarcinJuraszek

4

Le tuple sono a mio parere un invito alla modellazione di dati non validi. Invece di creare un modello appropriato, ottieni un oggetto generico che può contenere n proprietà dell'oggetto. La denominazione è molto generica. Item1..ItemN

+1

Immagino che abbiano un senso per oggetti di breve durata prima dell'invenzione di tipi anonimi. –

+0

@JonathanAllen Tranne che i tipi anonimi sono stati più a lungo di 'Tuple'. –

+0

Sì, questo ha messo una ruga nella storia. –

1

Si utilizzano Tuple come media per passare i dati tra una chiamata di metodo senza dover definire una nuova classe. In genere, utilizzare per restituire più pezzi di dati da un metodo piuttosto che utilizzare i parametri "out".

Ricordare che il parametro out non può essere utilizzato con i metodi async/await, in questo caso i tuple sono utili.

Probabilmente si desidera definire una classe per i dati se si codifica una libreria di classi riutilizzabile. Tuttavia, la tupla è ottima nel livello di presentazione.

Problemi correlati