réponse actuelle par @poke est correcte et constate des différences entre tuple et types anonymes. Je vais discuter de la raison pour laquelle vous les utiliseriez ou préféreriez les utiliser plutôt que les autres.
Deux nouvelles fonctions C# 7 suppriment les types anonymes. ValueTuples et Records.
La principale raison pour laquelle vous n'utiliser des types anonymes est
- vous ne pouvez pas utiliser des types anonymes dans le monde et ils sont uniquement type sûrs lorsqu'ils sont utilisés localement.ne pas être local, vous devez le traiter comme objet
dynamic
qui a des performances importantes en tête
Les raisons que vous préférez tuple sur les types anonymes.
ils sont de type sécurité dans tous les sens. (Indépendamment de nommer)
ils peuvent être utilisés comme arguments de la méthode, des arguments de type, champ et à peu près partout. (oui je l'ai dit à peu près, il ya des endroits qui doivent adopter avec des tuples, sa question de temps.)
puisqu'ils peuvent être utilisés comme argument de type, vous préférez probablement envelopper un ensemble léger de paramètres en un seul paramètre. comme Stack<(min, mid, max)>
vous pouvez changer les options de nommage à chaque fois que vous vous sentez le besoin, dans le nom de contexte générique item
peut satisfaire et dans un contexte plus spécifique dont vous avez besoin nom plus spécifique aussi, comme car
ils sont implicitement convertibles, int, int
peut être affecté à (int, long)
sans conversion explicite.
ils sont utilisés dans Deconstruct s. ce qui apporte beaucoup de sucre syntaxique à la langue.
vous pouvez avoir plusieurs missions et déclarations comme (int x, int y) = (0, 1)
Ayant toutes ces fonctionnalités, il y a encore une raison pour laquelle vous pouvez préférer type anonyme sur tuple.
- types anonymes sont le type de référence, mais sont tuples type de valeur.
mais que faire si vous souhaitez utiliser globalement le type anonyme? préférez-vous avoir des objets dynamiques ou des objets typés statiquement?
La fonction Enregistrements entrants à nouveau détruit les types anonymes. Avec les enregistrements, vous définissez votre classe de manière courte, concise et pratique. pas un gros problème. juste une seule ligne
public class Point(X, Y);
Tapez la sécurité partout, et vous avez également le type de référence à la main. ces deux nouvelles fonctionnalités apportent tout pour vaincre les types anonymes.
Notez que les enregistrements ne sont pas encore ajouté, nous avons juste à attendre.
ne reste l'utilisation réelle des types anonymes seront
ils servent toujours aussi fonction rétrocompatible
ils peuvent être utilisés dans requêtes LINQ lorsque vous utilisez type anonyme localement. par conséquent, je ne dis pas que les types anonymes sont redondants.
Comme je l'ai dit, ValueTuples n'est pas encore compatible avec tous les composants. C'est juste une question de temps, mais c'est comme ça que ça va être à l'avenir.
assez d'arguments. à mon humble avis, l'utilisation de types anonymes devient rare, les anciens programmeurs peuvent toujours utiliser le type anonyme dans Linq par habitude.
Peut-être la lisibilité? 'new {x, i}' rend tout à fait clair que c'est un nouvel objet qui est retourné, alors que j'ai dû comparer les deux exemples pour comprendre ce que fait le premier. Mais alors ça pourrait être moi. – stybl
D'une part, ils sont pris en charge dans les arbres d'expressions et les littéraux de tuple ne sont pas ... –
Notez que votre exemple ne compilerait pas dans C# 7.0 car '(x, i)' a des éléments de tuple sans nom, mais ils sont implicitement nommé dans C# 7.1. –