C# 7.0 вже деякий час, і всі знають, що в новій функції є оптимізація для кортежів: ValueTuple. Ось детальні приклади, які пояснюють кортеж і ValueTuple за 10 хвилин, щоб краще зрозуміти переваги та використання ValueTuple.
Якщо ви достатньо знаєте про Кортеж, можете пропустити розділ «Огляд кортежа» і одразу перейти до розділу «Пояснення вартості», щоб побачити вражаюче використання кортежів для цінності.
Згадайте Тапл
Tuple — це нова функція, яка з'явилася з C# 4.0 і доступна в .Net Framework 4.0 і вище.
Кортеж — це структура даних із певною кількістю та послідовністю елементів. Наприклад, спроєктуйте потрійну структуру даних для зберігання інформації учня, яка містить загалом три елементи: перший — це ім'я, другий — вік, а третій — зріст.
Конкретні застосування кортежів такі:
1. Як створити кортеж
За замовчуванням. Мережевий фреймворкКортежі підтримують лише від 1 до 7 елементів кортежівЯкщо є 8 елементів або більше, потрібно використовувати властивості вкладення та Rest у Tuple для реалізації. Крім того, клас кортежа надає статичний метод створення об'єктів кортежів.
Створюйте кортежі за допомогою конструкторів:
Побудуйте кортежі за допомогою статичного методу кортежа, підтримуючи до восьми елементів:
Примітка: Тип кортежа, побудований тут, насправді є Tuple<int, int, int, int, Tuple<int>> тобто тип даних, отриманий testTuple8.Rest — це Tuple<int>, тому щоб отримати точне значення, потрібно взяти властивість Item1.
2. Представляє набір даних Створіть кортеж нижче, який представлятиме три частини інформації про учня: ім'я, вік і зріст, не створюючи окремого додаткового класу.
3. Повернення кількох значень від методу Коли функція має повернути кілька значень, зазвичай можна використовувати вихідний параметр, а для повернення кількох значень можна використовувати кортежі замість вихідних.
4. Багатозначна передача для однопараметричних методів
Коли параметр функції — це лише один тип об'єкта, можна передавати кілька значень параметрів за допомогою реалізації кортежа.
Незважаючи на згадані вище зручні методи, кортежі також мають суттєві недоліки:
- При доступі до елементів ви можете отримати доступ лише через ItemX, і потрібно уточнити порядок елементів перед використанням, а імена атрибутів не мають практичного значення, що незручно запам'ятовувати.
- Є до восьми елементів, і якщо хочете більше, можна розширити лише вкладаючись з останнім елементом;
- Кортеж — це еталонний тип, а не тип значення, як інші прості типи, який виділяє простір у купі і може мати надто багато роботи зі створення та розподілу при інтенсивному завантаженні процесора.
Тому новий тип ValueTuple був введений у C# 7.0, який детально описано в наступних розділах.
ValueTuple детально пояснює
ValueTuple — одна з нових функцій C# 7.0, доступна для .Net Framework 4.7 і вище.
ValueTuple не потребує 4.7, якщо nuget підходить, 4.7 вбудована. Крім того, ValueTuple — це тип структури, Microsoft рекомендує не використовувати структури понад 64 байти, що також ефективно для ValueTuple.
Кортеж значень також є структурою даних, що використовується для представлення певної кількості та послідовності елементів, але відрізняється від класу кортежів, маючи такі основні відмінності:
Кортеж значення — це структура, тип значення, а не клас, тоді як кортеж — це клас, референсний тип; Елементи кортежа значення є змінними, а не лише для читання, тобто вони можуть змінювати значення елемента у кортежі значення; Кортеж значень елементів даних — це поле, а не атрибут. Специфічне використання кортежів з цінністю таке:
1. Як створити кортеж вартості Як і класи кортежів, .Net Framework value кортежі підтримують лише 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
|