可以在C#7.0中使用元组文字来启用面向方面编程

时间:2017-07-18 18:29:52

标签: tuples language-features c#-7.0 valuetuple

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

喜欢元组的文字理念。

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

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

例如:假设NextEmployee()是一些我没有源代码的库方法,并没有特别详细记录,并假设它向我返回(firstname: “jamie”, lastname: “hince”, id: 102348),我说:< / p>

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

编译器会愉快地将firstname分配给lastname,或者对它发出警告或错误。为什么不将姓氏映射到姓氏?

如果我们不必记住元组中的lastname索引,我会看到允许更松散耦合的体系结构,并且可以像这样请求方面“lastname”。

2 个答案:

答案 0 :(得分:3)

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

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

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

(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 {变种{1}}
  • and type names

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

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

但似乎您的意图是忽略var t = NextEmployee();LastName值:

id

但是如果你真的写(_, string lastname, _) = NextEmployee(); // declares a lastname variable and ignores firstname and id ,那么你要分配一个名为(string lastname, _, _) = NextEmployee();的本地字符串变量,其值为返回的字符串“variable”lastname

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

答案 1 :(得分:0)

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

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

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

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

Paulo已经很好地解释了技术细节,所以我不打算再重复一遍。