2

我指的是此处描述的元组文字:https ://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/#comment-321926

喜欢元组文字的想法。

但是我预见到很多查找返回元组中项目的顺序,并且想知道我们如何解决这个问题。

例如,将元组中的项目名称作为身份定义方面而不是顺序不是更有意义吗?或者有没有办法做到这一点,我没有看到?

例如:假设 NextEmployee() 是一些我没有源代码的库方法,也没有特别好的文档记录,假设它返回(firstname: “jamie”, lastname: “hince”, id: 102348)给我,我说:

(string lastname, var _, int __) = NextEmployee(); // I only need the last name

编译器要么愉快地将名字分配给姓氏,要么发出警告或错误。为什么不将姓氏映射到姓氏?

我会看到允许更松散耦合的架构,如果我们不必记住元组中姓氏的索引,并且可以只要求这样的“姓氏”方面。

4

2 回答 2

5

元组只是一个变量包。作为变量,您可以分配任何可分配给变量类型的值,而不管变量名称如何。

名称仅作为变量名称的指示。返回值的唯一区别是编译器使用TupleElementNames 属性保存元组元素的名称。

事实上,即使存在名称,如果您不使用与通常相同的名称,编译器也会警告您,这是一个错误并且仍然有效的语法:

(string firstname, string lastname, int id) NextEmployee()
    => (apples: "jamie", potatos: "hince", oranges: 102348);
/*
Warning CS8123 The tuple element name 'apples' is ignored because a different name is specified by the target type '(string firstname, string lastname, int id)'.
Warning CS8123 The tuple element name 'potatos' is ignored because a different name is specified by the target type '(string firstname, string lastname, int id)'.
Warning CS8123 The tuple element name 'oranges' is ignored because a different name is specified by the target type '(string firstname, string lastname, int id)'.
*/

您在此处使用的语法:

(string lastname, var _, int __) = NextEmployee();

不是元组声明语法,而是创建LastName变量、_变量和__变量的元组解构语法。

这些都是产生相同结果的等价物:

  • (var lastname, var _, var __) = NextEmployee(); // or any combination of变量and type names
  • var (lastname, _, __) = NextEmployee();

要声明一个元组以接收方法的返回,您需要声明一个元组变量:

  • (string firstname, string lastname, int id) t = NextEmployee();
  • var t = NextEmployee();

但似乎您的意图是忽略LastNameandid值:

(_, string lastname, _) = NextEmployee(); // declares a lastname variable and ignores firstname and id

但是,如果您真的编写(string lastname, _, _) = NextEmployee();了 ,那么您将分配一个本地字符串变量,该变量以lastname返回的字符串 "variable" 的值命名firstname

请记住,元组不是实体。它们是一组值。如果您使用的库使用元组作为实体,请注意该库可能存在其他问题。

于 2017-07-19T08:13:43.493 回答
0

为什么不?好吧,因为底层运行时甚至不知道名称。

编译器必须在编译期间执行此操作。我们在哪里停下来?错别字、大小写等呢?在我看来,目前的方式还可以。

如果您对此主题感到不同,请在 github 上的官方语言设计存储库中通过提出问题来提问:

https://www.github.com/dotnet/csharplang

Paulo 已经很好地解释了技术细节,所以我不会重复。

于 2017-07-19T13:06:04.033 回答