C# 用括号分组数据是如何工作的?

C# 用括号分组数据是如何工作的?,c#,valuetuple,C#,Valuetuple,我最近遇到了这样一个问题: (int, string) tst = (0, "Test"); 它背后的想法似乎很神奇,以前每当我想映射两个变量时,我都会使用KeyValuePair。这似乎是在.NETCore中提供的,而不是在常规的.NET4.7.2上,这是我主要编程的地方 我是否遗漏了一些内容,或者这仅在.NET Core上可用?这个变量分组的名称是什么(以便我进一步研究)?这与创建具有两个变量的对象相同吗 以下是一个例子: (int, string) tst = (0, "Test");

我最近遇到了这样一个问题:

(int, string) tst = (0, "Test");
它背后的想法似乎很神奇,以前每当我想映射两个变量时,我都会使用KeyValuePair。这似乎是在.NETCore中提供的,而不是在常规的.NET4.7.2上,这是我主要编程的地方

我是否遗漏了一些内容,或者这仅在.NET Core上可用?这个变量分组的名称是什么(以便我进一步研究)?这与创建具有两个变量的对象相同吗

以下是一个例子:

(int, string) tst = (0, "Test");
var (k, b) = tst;

Console.WriteLine("k: " + k);
Console.WriteLine("b: " + b);
这是一个愚蠢的问题,但感谢您的帮助。

您正在阅读OP中的代码。元组在C#7.0之前也是可用的,但C#7.0中元组的改进(引入)意味着,可以为元组字段使用语义名称,如示例所示

(int, string) tst = (0, "Test");
在上面的代码中,元组被解包并分配给
tst
变量。这就是所谓的元组

请考虑来自OP的以下代码

(int, string) tst = (0, "Test");
var (k, b) = tst;
您可以将此组合为

var (k, b) =  (0, "Test");
您也可以在用户定义的类型中使用Deconstruct。例如,考虑下面的代码

public class User
{
    public string FirstName{get;set;}
    public string LastName{get;set;}
    public int Age{get;set;}
}
为了在上述类中支持解构,您可以添加如下方法

public class User
{
    public string FirstName{get;set;}
    public string LastName{get;set;}
    public int Age{get;set;}

    public void Deconstruct(out string fName,out string lName,out int age)
    {
        fName = FirstName;
        lName = LastName;
        age = Age;
    }
}
解构方法现在使我们能够支持用户类中的解构。您现在可以编写类似于元组解构的代码。比如说,

var user = new User{FirstName = "John", LastName="Doe",Age=50};
var (fName,lName,age) = user;
您正在查看OP中的代码。元组在C#7.0之前也是可用的,但C#7.0中元组的改进(引入)意味着,可以对元组字段使用语义名称,如示例所示

(int, string) tst = (0, "Test");
在上面的代码中,元组被解包并分配给
tst
变量。这就是所谓的元组

请考虑来自OP的以下代码

(int, string) tst = (0, "Test");
var (k, b) = tst;
您可以将此组合为

var (k, b) =  (0, "Test");
您也可以在用户定义的类型中使用Deconstruct。例如,考虑下面的代码

public class User
{
    public string FirstName{get;set;}
    public string LastName{get;set;}
    public int Age{get;set;}
}
为了在上述类中支持解构,您可以添加如下方法

public class User
{
    public string FirstName{get;set;}
    public string LastName{get;set;}
    public int Age{get;set;}

    public void Deconstruct(out string fName,out string lName,out int age)
    {
        fName = FirstName;
        lName = LastName;
        age = Age;
    }
}
解构方法现在使我们能够支持用户类中的解构。您现在可以编写类似于元组解构的代码。比如说,

var user = new User{FirstName = "John", LastName="Doe",Age=50};
var (fName,lName,age) = user;

这是一个“值元组”,使用C#7中添加的语法(类型名称、元组创建和分解)。查看元组:@VillageTech-语义是针对(结构),而不是(类)。这是一个“值元组”,使用C#7中添加的语法(类型名称、元组创建和分解)。查看元组:@VillageTech-语义是针对(结构),而不是(类)。有趣的信息:在“(…,…=(…,…)”的情况下,C#编译器完全分解操作,甚至不创建元组实例;它与手动n变量交换/赋值一样有效。有趣的信息:在“(…,…=(…)”中案例C#编译器完全分解操作,甚至不创建元组实例;它与手动n变量交换/赋值一样高效。