Qual è la differenza tra tipo anonimo e tupla?Tipo anonimo e tupla
risposta
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.
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
.
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.
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.
- 1. tipo anonimo e più proprietà
- 2. Trasmissione a tipo anonimo
- 3. IEqualityComparer per tipo anonimo
- 4. Proprietari di tipo anonimo
- 5. scala tipo tupla composizione
- 6. Ottenere valore dal tipo anonimo
- 7. Tipo tupla vs. tipo matrice-unione
- 8. Creare un nuovo elenco tipo anonimo all'unione sul tipo di elenco anonimo
- 9. Passare un'istanza di tipo anonimo su WCF
- 10. Creare un tipo anonimo da reflection ParamInfo []
- 11. tipo anonimo nel caso del ripetitore DataBound
- 12. Tipo C# anonimo accesso da altro metodo
- 13. Come restituire il tipo anonimo personalizzato?
- 14. Lancio del tipo anonimo a dinamico
- 15. Creazione dinamica di un tipo anonimo?
- 16. Asserzione di JsonResult contenente il tipo anonimo
- 17. Test tipo di elementi tupla/elenco python
- 18. Tipo di dati coppia/tupla in Go
- 19. determinare se un tipo è un tipo anonimo
- 20. Impossibile creare un valore costante di tipo "Tipo anonimo"
- 21. Perché usare il tipo anonimo funziona e usa un tipo esplicito non in un GroupBy?
- 22. Come creare un nuovo tipo di tupla da uno vecchio e un tipo in boost?
- 23. Conversione tupla e lista ricorsiva
- 24. std :: tupla e layout standard
- 25. ThreadPool.QueueUserWorkItem con un'espressione lambda e metodo anonimo
- 26. Dichiarare un membro di tipo anonimo con un nome semplice
- 27. Converti KeyValuePair in tipo anonimo in una query LINQ
- 28. Tipo anonimo LINQ che non fornisce l'elenco necessario
- 29. Posso deserializzare JSON nel tipo anonimo in C#?
- 30. Accesso alle proprietà di un tipo anonimo in C#?
Ecco un articolo che spiega cosa si desidera: http://msdn.microsoft.com/en-us/vcsharp/ee957397.aspx –