C# 7.0 中的元组文字可以启用面向方面的编程吗

IkG*_*Mee 2 language-features tuples c#-7.0 valuetuple

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

\n\n

喜欢元组字面意思。

\n\n

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

\n\n

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

\n\n

例如:假设 NextEmployee() 是一些库方法,我没有\xe2\x80\x99t 的源代码,并且\xe2\x80\x99t 没有特别详细的文档记录,假设它返回(firstname: \xe2\x80\x9cjamie\xe2\x80\x9d, lastname: \xe2\x80\x9chince\xe2\x80\x9d, id: 102348)给我,我说:

\n\n
(string lastname, var _, int __) = NextEmployee(); // I only need the last name\n
Run Code Online (Sandbox Code Playgroud)\n\n

编译器要么很乐意将名字分配给姓氏,要么对此发出警告或错误。为什么不直接将姓氏映射到姓氏呢?

\n\n

我\xe2\x80\x99d 看到允许更松散耦合的架构,如果我们\xe2\x80\x99t 不必记住元组中姓氏的索引,并且可以只要求一个方面\xe2\x80\x9clastname\ xe2\x80\x9d 之类的。

\n

Pau*_*ado 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)'.
*/
Run Code Online (Sandbox Code Playgroud)

您在这里使用的语法:

(string lastname, var _, int __) = NextEmployee();
Run Code Online (Sandbox Code Playgroud)

不是元组声明语法,而是创建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();

但看来您的意图是忽略LastNameid值:

(_, string lastname, _) = NextEmployee(); // declares a lastname variable and ignores firstname and id
Run Code Online (Sandbox Code Playgroud)

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

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