Je veux commencer par mentionner que C# déjà eu de soutien pour les types anonymes. Qui sont des types référence. Ainsi, vous aviez déjà une alternative à la création d'une classe nommée.
L'un des avantages d'un nom de classe est la classe sera plus facile de les réutiliser (par exemple, si vous avez besoin du même type dans plusieurs endroits) et document. Depuis le type anonyme, anonyme, vous ne pouvez obtenir des variables typées, si vous pouvez utiliser var
, ce qui limite les contextes dans lesquels les types anonymes sont utiles (par exemple, vous ne pouvez pas les utiliser comme des types de champs, types de retour ou des types de paramètres).
Bien sûr, vous pouvez aller sur certains de les limitations des types anonymes en utilisant System.Tuple
. Qui est aussi un type de référence, et vous pouvez l'utiliser de manière explicite. L'inconvénient est qu'il manque des noms personnalisés pour les membres.
C# 7 n-uplets (ValueTuple
) peuvent être considérés comme similaires aux types anonymes. La première différence est qu'ils sont des types de valeur. Cela signifie que ces n-uplets aura avantage de performance tant qu'ils restent à portée locale ou se déplaçant à travers la pile (qui est l'utilisation commune des types anonymes, en raison de sa limitation).
La deuxième différence est que la nouvelle syntaxe permet aux tuples d'apparaître dans plus d'endroits que les types anonymes, comme vous le savez, vous avez de sucre syntaxique pour définir le type de retour d' ValueTuple
(tout en utilisant les types anonymes de retour object
).
La troisième différence est que, ValueTuple
prend en charge la déconstruction de la boîte. Pour citer les nouveautés de C# 7.0:
Une autre façon de consommer de tuples est à déconstruire. La déconstruction de la déclaration est d'une syntaxe pour la division d'un n-uplet (ou autre valeur) dans ses parties, et l'affectation de ces pièces individuellement frais variables:
(string first, string middle, string last) = LookupName(id1); // deconstructing declaration
WriteLine($"found {first} {last}.");
Que vous pouvez aussi le faire avec des types personnalisés en ajoutant une Déconstruire méthode.
Pour résumé:
-
ValueTuple
a sucre syntaxique en C# 7.0, qui doivent être considérées pour des raisons de lisibilité.
-
ValueTuple
est un type valeur. Tous les avantages et les inconvénients entre l'utilisation d'un class
et struct
s'appliquent.
-
ValueTuple
peut être utilisé explicitement (avec ou sans sucre syntaxique) lui permettant d'avoir la polyvalence de l' System.Tuple
tout en conservant les membres nommés.
-
ValueTuple
prend en charge la déconstruction.
Donné, qui doit il est sucre syntaxique, je dirais que le plus fort argument pour choisir ValueTuple
est le même argument pour choisir un struct
. Ce qui serait idéal pour les petits, immuable types, qui vivent pour la plupart sur la pile (si vous n'avez pas beaucoup de boxing et unboxing).
En comparant ValueTuple
contre une véritable structure, considérant le sucre syntaxique, je suggère d'utiliser ValueTuple
par défaut, sauf si vous avez besoin d'une disposition explicite ou vous avez besoin d'ajouter des méthodes à elle.
Je tiens aussi à dire que le sucre syntaxique n'est pas nécessairement d'améliorer la lisibilité. La raison principale étant que vous n'êtes pas à nommer le type et le nom du type qui donne un sens à la code. En plus de cela, vous pouvez ajouter de la documentation à un struct
ou class
déclaration qui facilite la compréhension.
Dans l'ensemble, la situation où l' ValueTuple
brille vraiment, c'est de retourner plusieurs valeurs à partir d'une méthode. Dans ce cas, la suppression de la nécessité de créer de nouveaux out
paramètres. Et la documentation de l' ValueTuple
utilisé peut vivre dans la documentation de la méthode. Si vous trouvez que vous avez besoin de faire autre chose avec l' ValueTuple
(définition de méthodes d'extension par exemple), je suggère d'envisager la création d'un type nommé à la place.