2010-04-10 4 views
22

Quelle est la différence entre un type anonyme et un tuple?Type et tuple anonymes

+2

Voici un article expliquant ce que vous voulez: http://msdn.microsoft.com/en-us/vcsharp/ee957397.aspx –

Répondre

14

Les types anonymes ont des noms de propriété qui contiennent plus d'informations, pour les tuples vous ne l'avez pas. Vous ne pouvez pas utiliser les types anonymes comme valeurs et paramètres de retour et vous pouvez le faire avec des tuples.

Un exemple de quand un tuple est agréable est quand vous voulez retourner plusieurs valeurs. @Petar Minchev mentions this link qui donne un bon exemple.

Vous souhaiterez peut-être une méthode Find() qui renvoie à la fois un index et la valeur. Un autre exemple serait la position dans un plan 2D ou 3D.

18

Un tuple n'est pas un type anonyme, c'est un type nommé. Vous pouvez l'utiliser comme argument de type ou de méthode de retour. Ce code est valable:

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

Vous ne pouvez pas le faire avec un type anonyme, vous devez retourner System.Object à la place. En général, vous devez utiliser Reflection sur ces objets (ou dynamic dans .NET 4) afin d'obtenir les valeurs des propriétés individuelles.

En outre, comme mentionne Brian, les noms de propriété sur un Tuple sont fixés - ils sont toujours Item1, Item2, Item3 et ainsi de suite, alors qu'avec un type anonyme vous pouvez choisir les noms. Si vous écrivez:

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

Ensuite, le type anonyme a fait ID et Name propriétés. Mais si vous écrivez:

Tuple.Create(1, "Bob") 

Puis le tuple résultant a juste propriétés Item1 et Item2.

8

Un autre point en faveur des types anonymes serait que vous pouvez facilement avoir plus de 8 propriétés. Bien que ce soit faisable en utilisant des tuples, ce n'est pas si joli.

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

ou d'écrire vos propres classes de tuple.


Une similitude intéressante à noter est que les deux tuples et des types anonymes vous donnent immuabilité et la comparabilité de l'égalité (les deux remplacements Equals et GetHashCode) en fonction des propriétés par défaut.

8

Juste une petite mise à jour de cette réponse puisque C# 7 est sorti dans la nature. Les tuples ont maintenant de super pouvoirs et peuvent parfois remplacer des types et des classes anonymes. Prenons par exemple cette méthode qui accepte et renvoie des tuples avec des propriétés nommées.

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()); 
} 

C'est cool.