У попередній статті цієї серії я розглядав використання params collections, однієї з новинок, що з'явились у C# 13:
Новинки C# 13: params collections
Ця функціональність дозволяє використовувати параметр params з колекціями різних типів, крім масивів (що може значно полегшити передачу параметрів у метод). Це відкриває шлях до різних перевантажень (overloads) одного і того ж методу, при цьому реалізації будуть базуватись на використанні params.
Клас OverloadResolutionTester демонструє перевантаження методу PrintItems, які ілюструють цю можливість, приймаючи для цього параметри на основі string[], ReadOnlySpan та IEnumerable:
Використовуючи ці реалізації, як показано у наступному списку:
Отримаємо результат, показаний на наступному зображенні. Варто зазначити, що при третьому виклику PrintItems значення були передані лише з розділенням комами (без вказівки конкретного типу), при цьому компілятор вибрав варіант з кращою продуктивністю (в даному випадку це був ReadOnlySpan, замість string[] або IEnumerable):
Натисніть на це зображення, щоб переглянути у кращій якості
Ця нова можливість, пов'язана з використанням params collections, була названа overload resolution. Можна піти ще далі, надаючи пріоритет одному з перевантажень порівняно з іншими за допомогою атрибута OverloadResolutionPriorityAttribute (namespace System.Runtime.CompilerServices).
Це демонструє реалізація типу OverloadResolutionPriorityTester, де вищий значення, зазначене в OverloadResolutionPriority, відповідає більшому пріоритету:
Повертаючись до тестів з використанням змінних із попереднього прикладу, але тепер з реалізацією PrintItems в OverloadResolutionPriorityTester:
Ми отримаємо результат, показаний на наступному зображенні. Перші (із використанням масиву) та треті виклики (із значеннями, розділеними комами) були асоційовані з перевантаженням, яке базується на IEnumerable, оскільки ця реалізація має вищий пріоритет:
Натисніть на це зображення, щоб переглянути у кращій якості
Повний код, що тестує реалізації OverloadResolutionTester та OverloadResolutionPriorityTester, подано в наступному списку:
Результат виконання цього тестового застосунку зображено на наступному зображенні:
Натисніть на це зображення, щоб переглянути у кращій якості
Цей проєкт доступний на GitHub:
https://github.com/renatogroffe/CSharp13-ConsoleApp-OverloadResolution
Якщо ви знайдете це рішення корисним, будь ласка, поставте ⭐️ у репозиторії на підтримку. Також запрошую слідкувати за мною на GitHub!
У недавньому ефірі на Canal .NET я також продемонстрував цей приклад з іншими варіаціями, як ви можете побачити в відео нижче (натисніть на цей посилання, щоб переглянути вміст на YouTube):
Посилання
C# 13 - Посібник: статті, поради, відео та приклади використання
.NET 9 - Посібник: статті, поради, відео та приклади використання
Що нового в C# 13 | Microsoft Learn
Перекладено з: Novidades do C# 13: Overload resolution