元组能够组合不同类型的对象。使用数组可以组合相同类型的对象,而元组允许使用类型的不同组合。元组有助于减少以下两个需求:
· 定义自定义类或结构,以返回多个值
· 定义参数,从方法中返回多个值.自从.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}");
}