2010-04-10 25 views
22

Qual è la differenza tra tipo anonimo e tupla?Tipo anonimo e tupla

+2

Ecco un articolo che spiega cosa si desidera: http://msdn.microsoft.com/en-us/vcsharp/ee957397.aspx –

risposta

14

I tipi anonimi hanno nomi di proprietà che portano più informazioni, per le tuple non si dispone di questo. Non è possibile utilizzare i tipi anonimi come valori di ritorno e parametri, ma è possibile utilizzare le tuple.

Un esempio di quando una tupla è piacevole è quando si desidera restituire più valori. @Petar Minchev mentions this link che dà un buon esempio.

È possibile che si desideri un metodo Find() che restituisca sia un indice sia il valore. Un altro esempio potrebbe essere la posizione in un piano 2D o 3D.

18

Una tupla non è un tipo anonimo, è un tipo denominato. Puoi usarlo come argomento di ritorno o di metodo. Questo codice è valido:

Tuple<int, string> GetTuple() 
{ 
    return Tuple.Create(1, "Bob"); 
} 

Non si può fare questo con un tipo anonimo, si dovrà tornare System.Object invece. In genere, si finisce per dover utilizzare Reflection su questi oggetti (o dynamic in .NET 4) per ottenere i valori delle singole proprietà.

Inoltre, come cita Brian, i nomi delle proprietà su un Tuple sono fissi - sono sempre Item1, Item2, Item3 e così via, mentre con un tipo anonimo si arriva a scegliere i nomi. Se si scrive:

var x = new { ID = 1, Name = "Bob" } 

Poi il tipo anonimo ha effettivamente ID e Name proprietà. Ma se si scrive:

Tuple.Create(1, "Bob") 

Poi la tupla risultante ha solo proprietà Item1 e Item2.

8

Un altro punto a favore di tipi anonimi sarebbe che si possono facilmente avere più di 8 proprietà. Anche se questo è fattibile usando le tuple, non è così carino.

var tuple = Tuple.Create(1, 2, 3, 4, 5, 6, 7, Tuple.Create(8, 9)); //and so on 

o scrivere le tue classi di tuple.


una somiglianza interessante da notare è che entrambi i tuple e tipi anonimi ti danno immutabilità e l'uguaglianza comparabilità (entrambe le sostituzioni Equals e GetHashCode) in base alle proprietà per impostazione predefinita.

8

Solo un piccolo aggiornamento a questa risposta poiché C# 7 è fuori in the wild. Le tuple ora hanno superpoteri e a volte possono sostituire tipi e classi anonimi. Prendiamo ad esempio questo metodo che accetta e restituisce tuple con proprietà denominate.

void Main() 
{ 
    var result = Whatever((123, true)); 
    Debug.Assert(result.Something == 123); 
    Debug.Assert(result.Another == "True"); 
} 

(int Something, string Another) Whatever((int Neat, bool Cool) data) 
{ 
    return (data.Neat, data.Cool.ToString()); 
} 

Questo è bello.

Problemi correlati