Посібник C#, Огляд узагальнень

Після появи першого випуску платформи .NET програмісти часто використовували простір імен System.Collections для більш гнучкого способу управління даними у додатках. Однак, починаючи з версії .NET 2.0, мова програмування C# була розширена підтримкою засобу, який називається . Разом з ним бібліотеки базових класів поповнилися новим простором імен, пов'язаним з колекціями — System.Collections.Generic.

Термін узагальнення по суті означає параметризований тип. Особлива роль параметризованих типів у тому, що дозволяють створювати класи, структури, інтерфейси, методи і делегати, у яких оброблювані дані вказуються як параметра. За допомогою узагальнень, наприклад, можна створити єдиний клас, який автоматично стає придатним для обробки різнотипних даних. Клас, структура, інтерфейс, метод або делегат, що оперує параметризованим типом даних, називається узагальненим, наприклад, узагальнений клас або узагальнений метод.

Але справа в тому, що в такому коді важко було дотриматися типової безпеки, оскільки для перетворення типу object в конкретний тип даних потрібно приведення типів. І це служило потенційним джерелом помилок через те, що приведення типів могло бути ненавмисно виконано неправильно. Ця скрута дозволяє подолати узагальнення, забезпечуючи типову безпеку, якої раніше так бракувало. Крім того, узагальнення спрощують весь процес, оскільки виключають необхідність виконувати приведення типів перетворення об'єкта або іншого типу оброблюваних даних. Таким чином, узагальнення розширюють можливості повторного використання коду та дозволяють робити це надійно та просто.

Узагальнення – це не зовсім новаконструкція; подібні концепції є і в інших мовах. Наприклад, подібні до узагальненнями риси мають шаблони С++. Однак між шаблонами С++ та узагальненнями .NET є велика різниця. У С++ під час створення екземпляра шаблону з певним типом необхідний вихідний код шаблонів. На відміну від шаблонів С++ узагальнення є не тільки конструкцією мови C#, але також визначені для CLR. Це дозволяє створювати екземпляри шаблонів з певним типом-параметром на мові Visual Basic, навіть якщо узагальнений клас визначено C#.

Давайте розглянемо основні переваги використання узагальнень:

Продуктивність

Однією з основних переваг узагальнень є продуктивність. Використання типів значень з неузагальненими класами колекцій викликаєупаковку (boxing) ірозпаковування (unboxing) при перетворенні на тип посилань і назад.

Типи значень зберігаються у стеку, а типи посилань - у купі. Класи C# є типами посилань, а структури - типами значень. .NET дозволяє легко перетворювати типи значень на посилання, тому їх можна використовувати там, де очікуються об'єкти (тобто посилання типи). Наприклад, об'єкту можна присвоїти значення типу int.

Перетворення типу значень на тип посилань називається упаковкою (boxing). Упаковка відбувається автоматично, коли метод очікує параметр типу посилання, а йому передається тип значень. З іншого боку, упакований тип значень може бути перетворений назад до простого типу значень за допомогою розпакування (unboxing). При розпакуванні потрібна операція приведення.

Безпека

Іншою властивістю узагальнень є безпека типів. Узагальнення автоматично забезпечують типову безпеку всіх операцій. У ході виконання цих операцій узагальненнявиключають необхідність звертатися до приведення типів та перевіряти відповідність типів у коді вручну.

Повторне використання двійкового коду

Узагальнення підвищують рівень повторного використання двійкового коду. Узагальнений клас може бути визначений одного разу, і його основі можуть бути створені екземпляри багатьох типів. При цьому не потрібно мати доступ до вихідних текстів, як це необхідно у випадку шаблонів C++.

"Розбухання" коду

Наскільки багато коду генерується під час створення екземплярів конкретних типів із узагальнень? Оскільки визначення узагальненого класу входить у складання, створення з його основі конкретних класів специфічних типів не призводить до дублювання коду в IL.

Рекомендації щодо іменування

Якщо в програмі використовуються узагальнення, дуже корисно, коли змінні узагальнених типів легко можна відрізнити від неузагальнених. Нижче наведено рекомендації щодо іменування узагальнених типів:

Імена узагальнених типів мають починатися з літери Т.

Якщо узагальнений тип може бути замінений будь-яким класом, оскільки немає жодних спеціальних вимог, і використовується тільки один узагальнений тип, T — відповідне ім'я для узагальненого типу:

Якщо до узагальненого типу пред'являються спеціальні вимоги (наприклад, що тип повинен реалізовувати інтерфейс або успадковуватися від певного класу), або ж використовується два або більше узагальнених типів як параметрів, слід застосовувати осмислені імена типів: