C# ValueTuple(值元组)
C#7.0(.NET Framework 4.7)引入了 ValueTuple 结构,它是元组的值类型表示。
ValueTuple仅在.NET Framework 4.7中可用。如果您在项目中没有看到ValueTuple,则需要安装ValueTuple。(.NET Framework 4.7或更高版本,或.NET Standard Library 2.0或更高版本已包含ValueTuple。)
要安装ValueTuple软件包,请在解决方案资源管理器中的项目上单击鼠标右键,然后选择Manage NuGet Packages..。这将打开NuGet软件包管理器。单击Browse选项卡,在搜索框中搜索ValueTuple,然后选择System.ValueTuple包,如下所示。
ValueTuple初始化
创建和初始化 ValueTuple 很容易。可以使用括号()并在其中指定值来创建和初始化它。
var person = (1, "Bill", "Gates"); //等效元组 //var person = Tuple.Create(1,“ Bill”,“ Gates”);"Bill", "Gates");
也可以通过指定各元素的类型初始化 ValueTuple ,如下所示。
ValueTuple<int, string, string> person = (1, "Bill", "Gates"); person.Item1; // 返回1 person.Item2; // 返回 "Bill" person.Item3; // 返回 "Gates"
以下是为每个成员声明类型的简写方法。
(int, string, string) person = (1, "Bill", "Gates"); person.Item1; // 返回1 person.Item2; // 返回 "Bill" person.Item3; // 返回 "Gates"
请注意,我们没有在上面的 tuple 初始化语句中使用 var 相反,我们在方括号中提供了每个成员值的类型。
元组至少需要两个值。以下不是元组的情况:
var number = (1); // int类型,不是元组 var numbers = (1,2); // 有效元组
与 Tuple 不同,ValueTuple 可以包含八个以上的值。
var numbers = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);
命名成员
我们可以为ValueTuple属性分配名称,而不是使用默认属性名称,例如Item1,Item2等。
(int Id, string FirstName, string LastName) person = (1, "Bill", "Gates"); person.Id; // 返回1 person.FirstName; // 返回 "Bill" person.LastName; // 返回 "Gates"
我们还可以在右侧为成员名称分配值,如下所示。
var person = (Id:1, FirstName:"Bill", LastName: "Gates");
请注意,我们可以在左侧或右侧提供成员名称,但不能在两侧提供成员名称。左侧优先于右侧。以下内容将忽略右侧的名称。
// PersonId,FName,LName将被忽略。 (int Id, string FirstName, string LastName) person = (PersonId:1, FName:"Bill", LName: "Gates"); //PersonId,FirstName,LastName将被忽略。它将具有默认名称:Item1,Item2,Item3。 (string, string, int) person = (PersonId:1, FName:"Bill", LName: "Gates");
我们还可以将变量分配为成员值。
string firstName = "Bill", lastName = "Gates"; var per = (FirstName: firstName, LastName: lastName);
ValueTuple作为返回类型
以下方法返回ValueTuple。
static void Main(string[] args) { DisplayTuple(1, "Bill", "Gates"); } static void DisplayTuple((int, string, string) person) { Console.WriteLine($"Id = { person.Item1}"); Console.WriteLine($"First Name = { person.Item2}"); Console.WriteLine($"Last Name = { person.Item3}"); }
我们还可以为方法返回的 ValueTuple 指定不同的成员名称。
static void Main(string[] args) { var person = GetPerson(); } static (int, string, string) GetPerson() { return (Id:1, FirstName: "Bill", LastName: "Gates"); }
解构
可以通过解构 ValueTuple 来检索它的各个成员。解构声明语法将 ValueTuple 拆分为多个部分,并分别将这些部分分配给新变量。
static void Main(string[] args) { // 更改属性名称 (int PersonId, string FName, string LName) = GetPerson(); } static (int, string, string) GetPerson() { return (Id:1, FirstName: "Bill", LastName: "Gates"); }
我们还可以使用 var 代替显式数据类型名称。
static void Main(string[] args) { // 使用var作为数据类型 (var PersonId, var FName, var LName) person = GetPerson(); } static (int, string, string) GetPerson() { return (Id:1, FirstName: "Bill", LastName: "Gates"); }
ValueTuple 还允许对不打算使用的成员进行“丢弃”解构。
// 对未使用的成员LName使用 下划线 _ 丢弃 (var id, var FName, _) = GetPerson();