ValueTuple是C#7.0中引入的结构,表示值类型Tuple。它已包含在.NET Framework 4.7或更高版本中。它允许您存储一个数据集,该数据集包含可能彼此相关或不相关的多个值。它可以存储从0到8的元素,并且可以存储不同类型的元素。您还可以将重复的元素存储在值元组中。
为什么我们需要ValueTuple?
我们已经有元组中用于存储多个值C#,但元组有一定的限制,这些限制是固定的ValueTuple。或者我们可以说ValueTuple是C#中Tuples的改进版本。它克服了元组的以下限制:
- 元组是引用类型,但ValueTuple是值类型。
- Tuple不提供命名约定,但是ValueTuple提供了强大的命名约定。
- 在元组中,不允许创建零成分的元组,但在ValueTuple中,则可以创建零元素的元组。
- ValueTuple的性能优于Tuple。因为ValueTuple提供了一种轻量级的机制,用于从现有方法中返回多个值。而且ValueTuple的语法比Tuples更优化。
- 通过使用解构和_关键字, ValueTuple为访问值元组的元素提供了更大的灵活性。但是Tuple无法提供解构概念和_关键字。
- 在ValueTuple中,诸如item1和item2之类的成员是字段。但是在Tuple中,它们是属性。
- 在ValueTuple中,字段是可变的。但是在Tuple中,字段是只读的。
创建一个ValueTuple
与Tuple不同,ValueTuples提供了一种简单的机制来创建和初始化ValueTuples。您可以使用以下3种方式创建ValueTuples:
- 使用构造函数:您可以使用ValueTuple
Struct提供的构造函数来创建ValueTuple。您可以在其中存储类型从1到8的元素。 句法:
// Constructor for creating one element ValueTuple
(T1) // Constructor for creating two elements ValueTuple (T1, T2) . . . // Constructor for creating eight elements ValueTuple (T1, T2, T3, T4, T5, T6, T7, TRest) 例子:
// C# program to illustrate how to // create value tuple using the // ValueTuple constructor. using System; class GFG { // Main method static public void Main() { // ValueTuple with one element ValueTuple
ValTpl1 = new ValueTuple (345678); // ValueTuple with three elements ValueTuple ValTpl2 = new ValueTuple ("C#", "Java", 586); // ValueTuple with eight elements ValueTuple > ValTpl3 = new ValueTuple >(45, 67, 65, 34, 34, 34, 23, new ValueTuple (90)); } } - 使用创建方法:当我们使用ValueTuple
结构的构造函数创建值元组时,我们需要提供存储在值元组中的每个元素的类型,这会使您的代码繁琐。因此,C#提供了另一个ValueTuple结构,该结构包含用于创建值元组对象的静态方法,而无需提供每个元素的类型。 句法:
// Method for creating an empty value tuple Create(); // Method for creating 1-ValueTuple Create
(T1) . . . // Method for creating 8-ValueTuple Create (T1, T2, T3, T4, T5, T6, T7, T8) 例子:
// C# program to create value tuple // using Create Method using System; public class GFG { // Main method static public void Main() { // Creating 0-ValueTuple // Using Create() Method var Valtpl1 = ValueTuple.Create(); // Creating 3-ValueTuple // Using Create(T1, T2, T3) Method var Valtpl2 = ValueTuple.Create(12, 30, 40, 50); // Creating 8-ValueTuple // Using Create(T1, T2, T3, T4, T5, T6, T7, T8) Method var Valtpl3 = ValueTuple.Create(34, "GeeksforGeks", 'g', 'f', 'g', 56.78, 4323, "geeks"); } }
- 使用括号():这是使用括号()创建ValueTuples的最简单形式,元素放置在它们之间。元素以两种不同的方式存储:
- 命名成员: ValueTuple允许您创建一个元组,其中每个组件都可以使用自己的名称。这样您就可以在其名称的帮助下访问该组件。它使您的程序更具可读性和易于记忆。您可以将名称分配给成员的左侧或右侧,但不能同时分配给两侧。如果为两侧分配了名称,则左侧优先于右侧,如下所示:
范例1:
// C# program to illustrated named member using System; public class GFG { static public void Main() { (int age, string Aname, string Lang) author = (23, "Sonia", "C#"); } }
范例2:
// C# program to illustrated named member using System; public class GFG { static public void Main() { var author = (age : 23, Aname : "Sonia", Lang : "C#"); } }
- 未命名成员:在ValueTuples中,未命名成员是那些没有名称的成员。它们只是创建而没有任何名称。如下所示:
范例1:
// C# program to illustrated UnNamed member using System; public class GFG { static public void Main() { var author = (20, "Siya", "Ruby"); } }
范例2:
// C# program to illustrated UnNamed member using System; public class GFG { static public void Main() { ValueTuple
author = (20, "Siya", "Ruby"); } }
- 命名成员: ValueTuple允许您创建一个元组,其中每个组件都可以使用自己的名称。这样您就可以在其名称的帮助下访问该组件。它使您的程序更具可读性和易于记忆。您可以将名称分配给成员的左侧或右侧,但不能同时分配给两侧。如果为两侧分配了名称,则左侧优先于右侧,如下所示:
访问ValueTuple成员
在这里,我们学习如何访问ValueTuples的已命名和未命名成员。
- 访问未命名成员:在ValueTuple中,可使用默认项目属性名称(如Item1,Item2,Item3等)访问未命名成员。如以下示例所示:
例子:
// C# program to illustrate how to // access unnamed members of ValueTuple using System; public class GFG { // Main Method static public void Main() { // ValueTuple with three elements var author = (20, "Siya", "Ruby"); // Accessing the ValueTuple // Using default Item property Console.WriteLine("Age:" + author.Item1); Console.WriteLine("Name:" + author.Item2); Console.WriteLine("Language:" + author.Item3); } }
- 访问命名成员:在ValueTuples中,将根据其名称使用命名成员。无需使用默认item属性访问这些命名成员。如下例所示,ValueTuple包含三个元素,即Book_id,Author_name和Book_name。我们根据它们的名称直接访问这些元素。
例子:
// C# program to illustrate how to access // named members of ValueTuple using System; public class GFG { // Main Method static public void Main() { // ValueTuple with three elements var library = (Book_id : 2340, Author_name : "Arundhati Roy", Book_name : "The God of Small Things"); // Accessing the ValueTuple // according to their names Console.WriteLine("Book Id: {0}", library.Book_id); Console.WriteLine("Author Name: {0}", library.Author_name); Console.WriteLine("Book Name: {0}", library.Book_name); } }
输出:
Book Id: 2340 Author Name: Arundhati Roy Book Name: The God of Small Things
返回值元组
在C#中,允许您从方法中返回ValueTuple。如下例所示,TouristDetails方法返回一个包含3个元素的ValueTuple:
例子:
// C# program to illustrate how a
// method return ValueTuple
using System;
public class GFG {
// This method returns the tourist details
static(int, string, string) TouristDetails()
{
return (384645, "Sophite", "USA");
}
// Main method
static public void Main()
{
// Store the data provided by the TouristDetails method
var(Tourist_Id, Tourist_Name, Country) = TouristDetails();
// Display data
Console.WriteLine("Tourist Details: ");
Console.WriteLine($ "Tourist Id: {Tourist_Id}");
Console.WriteLine($ "Tourist Name: {Tourist_Name}");
Console.WriteLine($ "Country: {Country}");
}
}
输出:
Tourist Details:
Tourist Id: 384645
Tourist Name: Sophite
Country: USA