C# ValueTuple(值元組)

C#7.0(.NET Framework 4.7)引入了 ValueTuple 結(jié)構(gòu),它是元組的值類型表示。

ValueTuple僅在.NET Framework 4.7中可用。如果您在項(xiàng)目中沒(méi)有看到ValueTuple,則需要安裝ValueTuple。(.NET Framework 4.7或更高版本,或.NET Standard Library 2.0或更高版本已包含ValueTuple。)

要安裝ValueTuple軟件包,請(qǐng)?jiān)诮鉀Q方案資源管理器中的項(xiàng)目上單擊鼠標(biāo)右鍵,然后選擇Manage NuGet Packages..。這將打開(kāi)NuGet軟件包管理器。單擊Browse選項(xiàng)卡,在搜索框中搜索ValueTuple,然后選擇System.ValueTuple包,如下所示。

在C#中使用ValueTuple

ValueTuple初始化

創(chuàng)建和初始化 ValueTuple 很容易??梢允褂美ㄌ?hào)()并在其中指定值來(lái)創(chuàng)建和初始化它。

var person = (1, "Bill", "Gates");    
//等效元組
//var person = Tuple.Create(1,“ Bill”,“ Gates”);"Bill", "Gates");

也可以通過(guò)指定各元素的類型初始化 ValueTuple ,如下所示。

ValueTuple<int, string, string> person = (1, "Bill", "Gates");
person.Item1;  // 返回1
person.Item2;   // 返回 "Bill"
person.Item3;   // 返回 "Gates"

以下是為每個(gè)成員聲明類型的簡(jiǎn)寫(xiě)方法。

(int, string, string) person = (1, "Bill", "Gates");
person.Item1;  // 返回1
person.Item2;   // 返回 "Bill"
person.Item3;   // 返回 "Gates"

請(qǐng)注意,我們沒(méi)有在上面的 tuple 初始化語(yǔ)句中使用 var 相反,我們?cè)诜嚼ㄌ?hào)中提供了每個(gè)成員值的類型。

元組至少需要兩個(gè)值。以下不是元組的情況:

var number = (1);  // int類型,不是元組
var numbers = (1,2); // 有效元組

與 Tuple 不同,ValueTuple 可以包含八個(gè)以上的值。

var numbers = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14);

命名成員

我們可以為ValueTuple屬性分配名稱,而不是使用默認(rèn)屬性名稱,例如Item1,Item2等。

(int Id, string FirstName, string LastName) person = (1, "Bill", "Gates");
person.Id;   // 返回1
person.FirstName;  // 返回 "Bill"
person.LastName; // 返回 "Gates"

我們還可以在右側(cè)為成員名稱分配值,如下所示。

var person = (Id:1, FirstName:"Bill", LastName: "Gates");

請(qǐng)注意,我們可以在左側(cè)或右側(cè)提供成員名稱,但不能在兩側(cè)提供成員名稱。左側(cè)優(yōu)先于右側(cè)。以下內(nèi)容將忽略右側(cè)的名稱。

// PersonId,F(xiàn)Name,LName將被忽略。
(int Id, string FirstName, string LastName) person = (PersonId:1, FName:"Bill", LName: "Gates");

//PersonId,F(xiàn)irstName,LastName將被忽略。它將具有默認(rèn)名稱: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");
}

解構(gòu)

可以通過(guò)解構(gòu) ValueTuple 來(lái)檢索它的各個(gè)成員。解構(gòu)聲明語(yǔ)法將 ValueTuple 拆分為多個(gè)部分,并分別將這些部分分配給新變量。

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 代替顯式數(shù)據(jù)類型名稱。

static void Main(string[] args)
{    
    // 使用var作為數(shù)據(jù)類型
    (var PersonId, var FName, var LName) person = GetPerson();
}

static (int, string, string) GetPerson() 
{ 
   return (Id:1, FirstName: "Bill", LastName: "Gates");
}

ValueTuple 還允許對(duì)不打算使用的成員進(jìn)行“丟棄”解構(gòu)。

// 對(duì)未使用的成員LName使用 下劃線 _ 丟棄
(var id, var FName, _) = GetPerson();
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清