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

C# 基础教程

C# 高级教程

C# 面向对象(OOP)

ValueTuple (Значение множественного элемента) в C#

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软件包,请在解决方案资源管理器中的项目上单击鼠标右键,然后选择Manage NuGet Packages..。这将打开NuGet软件包管理器。单击Browse选项卡,在搜索框中搜索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"

Обратите внимание, что мы не используем var в инициализаторе tuple, вместо этого мы указываем тип каждого члена в квадратных скобках.

Тупль должен содержать по крайней мере два значения. Следующие примеры не являются туплями:

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 будут ignored. Они будут иметь-default имена: Item1, Item2, Item3.
(string, string, int) person = (PersonId: 1, FName: "Bill", LName: "Gates");

Мы также можем assignировать переменные в качестве значений членов.

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. Грамматика destructuring разрывает ValueTuple на несколько частей иassignит их новым переменным.

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();