元组能够组合不同类型的对象。使用数组可以组合相同类型的对象,而元组允许使用类型的不同组合。元组有助于减少以下两个需求:
· 定义自定义类或结构,以返回多个值
· 定义参数,从方法中返回多个值.自从.NET Framework 4.0版本以来,元组就以泛型 Tuple 类的形式存在。然而,它们并没有得到广泛使用,因为元组的不同对象可以通过 Item1、Item2、Item3 等属性访问,这既不吸引人,也没有提供任何关于其含义的信息。
这在 C# 7中发生了变化,C# 7提供了在编程语言中集成的元组功能,这有了很大的改进,如下一个示例所示,它使用了一个简单的不可变的 Person 类:
public class Person{public Person(string firstName, string lastName){FirstName = firstName;LastName = lastName;}public string FirstName { get; }public string LastName { get; }public override string ToString() => $"{FirstName} {LastName}";//...}
元组的声明和初始化
private static void IntroTuples(){(string s, int i, Person p) t = ("magic", 42, new Person("Stephanie", "Nage1"));Console.WriteLine($"s: {t.s}, 1: {t.i}, p: {t.p}");//...}
s:magic,i:42,p:Stephanie Nage1
元组字面量也可以分配给元组变量,而不需要声明它的成员。这样,元组的成员就可以使用ValueTuple结构的成员名称来访问:Iteml、Item2和Item3。
private static void IntroTuples(){//...var t2 = ("magic", 42, new Person("Matthias", "Nage1"));Console.WriteLine($"string: {t2.Iteml}, int: {t2.Item2),person: {t2.Item3}");//..}
可以通过定义名称后跟冒号,来为元组字面量中的元组指定名称,它与对象字面量的语法相同:
private static void IntroTuples(){//...var t3 = (s: "magic", i: 42, p: new Person("Matthias", "Nage1"));Console.WriteLine($"s: {t3.s}, i: {t3.i}, p: {t3.p}");//...}
有了这些,名字只是一种方便的方式。当类型匹配时,可以将一个元组分配给另一个元组;名字并不重要:
private static void IntroTuples(){//...(string astring, int anumber, Person aperson) t4 = t3;Console.WriteLine($"s: {t4.astring}, i: {t4.anumber}, p: {t4.aperson}");}
