C# 7.0 вышел уже давно, и все знают, что в новой функции — ValueTuple есть оптимизация для кортежей. Вот подробные примеры, чтобы объяснить Кортеж против ValueTuple за 10 минут, чтобы лучше понять преимущества и применение ValueTuple.
Если вы достаточно хорошо знаете о кортежах, вы можете пропустить раздел «Обзор кортежа» и сразу перейти в раздел «ValueTuple Explained», чтобы увидеть впечатляющее использование кортежей ценности.
Оглянитесь назад на Тапл
Tuple — это новая функция, появившаяся в C# 4.0 и доступная в .Net Framework 4.0 и выше.
Кортеж — это структура данных с определённым количеством и последовательностью элементов. Например, спроектировать тройную структуру данных для хранения информации учащихся, которая содержит в общей сложности три элемента: первый — имя, второй — возраст, третий — рост.
Конкретные применения кортежей следующие:
1. Как создать кортеж
По умолчанию. Сетевой фреймворкКортежи поддерживают только от 1 до 7 элементов кортежаЕсли элементов 8 или больше, нужно использовать свойства вложения и отдыха Tuple для реализации. Кроме того, класс кортежа предоставляет статический метод создания объектов кортежа.
Создайте кортежи с помощью конструкторов:
Постройте кортежи с помощью метода кортежа статических, поддерживая до восьми элементов:
Примечание: тип кортежа, построенный здесь, на самом деле является Tuple<int, int, int, int, Tuple<int>> то есть тип данных, полученный через testTuple8.Rest — это Tuple<int>, поэтому чтобы получить точное значение, нужно использовать свойство Item1.
2. Представляет набор данных Создайте кортеж ниже, чтобы представить три части информации о студенте: имя, возраст и рост, не создавая отдельного класса.
3. Возврат нескольких значений из одного метода Когда функция должна вернуть несколько значений, обычно можно использовать параметр выхода, а вместо выходных — кортежи для возврата нескольких значений.
4. Многозначная передача для однопараметрических методов
Когда параметр функции — это только один тип объекта, с помощью реализации кортежа можно передавать несколько значений параметров.
Несмотря на вышеупомянутые удобные методы, кортежи также имеют значительные недостатки:
- При доступе к элементам можно получить доступ только через ItemX, и нужно уточнить порядок элементов перед использованием, а имена атрибутов не имеют практического значения, что неудобно запоминать.
- В игре до восьми элементов, и если хотите больше, можно расширить только вложившись с последним элементом;
- Кортеж — это эталонный тип, а не тип значения, как другие простые типы, который выделяет пространство на куче и может требовать слишком много работы по созданию и распределению при высокой нагрузке на процессор.
Поэтому в C# 7.0 был введён новый тип ValueTuple, который подробно описан в следующих разделах.
ValueTuple подробно объясняет
ValueTuple — одна из новых функций C# 7.0, доступная для .Net Framework 4.7 и выше.
ValueTuple не требует 4.7, если nuget в порядке, 4.7 встроен. Кроме того, ValueTuple — это тип структуры, Microsoft рекомендует не использовать структуры длиной выше 64 байт, что также эффективно для ValueTuple.
Кортеж значений — это также структура данных, используемая для представления определённого числа и последовательности элементов, но отличается от класса кортежей и имеет следующие основные отличия:
Кортеж со значением — это структура, тип значения, а не класс, а кортеж — класс, эталонный тип; Элементы кортежа значений переменны, а не только для чтения, то есть они могут изменять значение элемента в кортеже; Кортеж значений элементов данных — это поле, а не атрибут. Конкретное применение кортежей с ценностью следующее:
1. Как создать кортеж ценности Как и классы кортежей, кортежи значений в .Net Framework поддерживают только от 1 до 7 элементов, и если их 8 и более, нужно использовать вложенные и Rest свойства кортежа для реализации этого кортежа. Кроме того, класс ValueTuple может предоставлять статические методы для создания объектов кортежа значений.
Создайте кортежи с помощью конструкторов:
Постройте кортежи с помощью метода кортежа статических, поддерживая до восьми элементов:
Обратите внимание, что тип кортежа, построенный здесь, на самом деле представляет собой Tuple<int, int, <int>>, то есть тип данных, полученный с помощью testTuple8.Rest — это Tuple<int>, поэтому чтобы получить точное значение, нужно взять свойство Item1.
Оптимизационная разница:Когда построен кортеж значений с более чем 7 элементами, значения в вложенном кортеже можно получить с помощью следующего элемента ItemX, а для приведённого выше примера — получить доступ к десятому элементу через testTuple10.Rest.Item3 или testTuple10.Item10.
2. Представляет набор данных Создайте кортеж значений, чтобы представить три части информации о студенте: имя, возраст и рост, не создавая отдельного отдельного класса.
3. Возврат нескольких значений из одного метода Кортежи значений также могут возвращать несколько значений вместо параметра выхода в определении функции.
Оптимизационная разница:Возвращаемое значение можно необъяснимо задать в ValueTuple, используя новый синтаксис (,,), например (string, int, uint):
Отладка типа studentInfo — это триплет ValueType.
Оптимизационная разница:Возвращаемое значение может задать имя элемента для облегчения понимания назначения и доступа к памяти:
Удобное распределение памяти:
4. Многозначная передача для однопараметрических методов Когда параметр функции — это только один тип объекта, можно передавать несколько значений с помощью реализации кортежа значений.
5. Деконструировать ValueTuple Вы можете использовать var (x, y) или (var x, var y) для разрешения элементов кортежа с целью построения локальных переменных, при этом символ «_» игнорирует нежелательные элементы.
Как уже упоминалось, ValueTuple делает C# проще и удобнее в использовании. Основные преимущества перед Tuple следующие:
- ValueTuple поддерживает новый синтаксис для значений функций" (,,)", что упрощает код;
- Следует отметить, что хотя он и назван, но на самом деле кортеж не определяет атрибут или поле такого имени, настоящее имя всё равно является ItemX, и все имена элементов используются только при проектировании и компиляции, а не во время выполнения (поэтому обратите внимание на операции сериализации и десериализации этого типа);
- Некоторые или все кортежи элементов можно использовать удобнее с помощью методов уничтожения;
- Кортежи значений — это типы значений, которые эффективнее использовать, чем кортежи референсных типов, и у них есть метод сравнения, который можно использовать для сравнения их равенства, см. Подробности:https://msdn.microsoft.com/en-us/library/system.valuetuple
|