📜  C#中的ValueTuple

📅  最后修改于: 2021-05-29 15:54:51             🧑  作者: Mango

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成员

在这里,我们学习如何访问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