Новинки C# 13: Розв’язання перевантажень

pic

У попередній статті цієї серії я розглядав використання params collections, однієї з новинок, що з'явились у C# 13:

Новинки C# 13: params collections

Ця функціональність дозволяє використовувати параметр params з колекціями різних типів, крім масивів (що може значно полегшити передачу параметрів у метод). Це відкриває шлях до різних перевантажень (overloads) одного і того ж методу, при цьому реалізації будуть базуватись на використанні params.

Клас OverloadResolutionTester демонструє перевантаження методу PrintItems, які ілюструють цю можливість, приймаючи для цього параметри на основі string[], ReadOnlySpan та IEnumerable:

Використовуючи ці реалізації, як показано у наступному списку:

Отримаємо результат, показаний на наступному зображенні. Варто зазначити, що при третьому виклику PrintItems значення були передані лише з розділенням комами (без вказівки конкретного типу), при цьому компілятор вибрав варіант з кращою продуктивністю (в даному випадку це був ReadOnlySpan, замість string[] або IEnumerable):

pic

Натисніть на це зображення, щоб переглянути у кращій якості

Ця нова можливість, пов'язана з використанням params collections, була названа overload resolution. Можна піти ще далі, надаючи пріоритет одному з перевантажень порівняно з іншими за допомогою атрибута OverloadResolutionPriorityAttribute (namespace System.Runtime.CompilerServices).

Це демонструє реалізація типу OverloadResolutionPriorityTester, де вищий значення, зазначене в OverloadResolutionPriority, відповідає більшому пріоритету:

Повертаючись до тестів з використанням змінних із попереднього прикладу, але тепер з реалізацією PrintItems в OverloadResolutionPriorityTester:

Ми отримаємо результат, показаний на наступному зображенні. Перші (із використанням масиву) та треті виклики (із значеннями, розділеними комами) були асоційовані з перевантаженням, яке базується на IEnumerable, оскільки ця реалізація має вищий пріоритет:

pic

Натисніть на це зображення, щоб переглянути у кращій якості

Повний код, що тестує реалізації OverloadResolutionTester та OverloadResolutionPriorityTester, подано в наступному списку:

Результат виконання цього тестового застосунку зображено на наступному зображенні:

pic

Натисніть на це зображення, щоб переглянути у кращій якості

Цей проєкт доступний на 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

Leave a Reply

Your email address will not be published. Required fields are marked *