English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# ValueTuple(값 튜플)

C#7.0(.NET Framework 4.7)에서 ValueTuple 구조를 도입했습니다. 이는 튜플의 값형 표현입니다。

ValueTuple은 .NET Framework 4.7중에서 사용할 수 있습니다. 프로젝트에서 ValueTuple을 볼 수 없다면, ValueTuple을 설치해야 합니다。(.NET Framework 4.7또는 높은 버전, 또는 .NET Standard Library 2。0或更高版本已包含ValueTuple。)

要安装ValueTuple软件包,请在解决方案资源管理器中的项目上单击鼠标右键,然后选择管理NuGet软件包..。这将打开NuGet软件包管理器。单击浏览选项卡,在搜索框中搜索ValueTuple,然后选择System.ValueTuple包,如下所示。

ValueTuple初始化

创建和初始化 ValueTuple 很容易。可以使用括号()并在其中指定值来创建和初始化它。

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

也可以通过指定各元素的类型初始化 ValueTuple ,如下所示。

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

以下是为每个成员声明类型的简写方法。

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

请注意,我们没有在上面的 tuple 初始化语句中使用 var 相反,我们在方括号中提供了每个成员值的类型。

元组至少需要两个值。以下不是元组的情况:

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

与 Tuple 不同,ValueTuple 可以包含八个以上的值。

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

命名成员

我们可以为ValueTuple属性分配名称,而不是使用默认属性名称,例如Item1,Item2等。

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

我们还可以在右侧为成员名称分配值,如下所示。

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

请注意,我们可以在左侧或右侧提供成员名称,但不能在两侧提供成员名称。左侧优先于右侧。以下内容将忽略右侧的名称。

// PersonId,FName,LName가 무시됩니다。}
(int Id, string FirstName, string LastName) person = (PersonId:1, FName:"Bill", LName: "Gates");
//PersonId,FirstName,LastName가 무시됩니다. 기본 이름은 Item입니다.1,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");
}

구조화

ValueTuple을 통해 각 구성원을 검색할 수 있습니다. 구조화 문법은 ValueTuple을 여러 부분으로 분할하고, 각 부분을 새로운 변수에 할당합니다.

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를 사용할 수 있습니다.

static void Main(string[] args)
{    
    // 사용할 데이터 타입으로 var를 사용합니다.
    (var PersonId, var FName, var LName) person = GetPerson();
}
static (int, string, string) GetPerson()}} 
{ 
   return (Id:1, FirstName: "Bill", LastName: "Gates");
}

ValueTuple은 사용하지 않을 멤버에 대해 '버리기' 구조를 허용합니다.

// 미사용된 멤버 LName에 대해 _ 사용하여 버리기
(var id, var FName, _) = GetPerson();