English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 很容易。可以使用括号()并在其中指定值来创建和初始化它。
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.
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();