Вступ до C # Generics
Отже, що таке поняття Generics в C #? Простими словами, це концепція визначення незалежних від класів класів, інтерфейсів, методів, делегатів, властивостей тощо. Це означає, що ви можете визначити загальний клас або тіло методу та надати фактичний тип під час виклику.
Таким чином, Generics - це як шаблони коду. Вони дозволяють написати безпечний для коду блок-код, не посилаючись на якийсь тип даних. Тип вашого коду визначається під час компіляції під час виклику виклику для вашого класу чи методу.
Синтаксис дженерики в C #
Давайте подивимось на синтаксис загального оголошення в C #. Це дуже простий синтаксис.
Як звичайна практика, літера "Т", що складається із великої літери, укладена у кутові дужки, позначає декларацію загального коду на C #. Але це не мандат. Будь-яка літера з великої літери, вкладена у кутові дужки, може бути використана для позначення загального коду.
Декларація загального класу:
public class MyGenericClass
Моментальний загальний клас:
MyGenericClass = new MyGenericClass();
Оголошення загального похідного класу:
public class MyGenericDerivedClass : MyGenericBaseClass
Декларація загального методу:
public T MyGenericMethod(T item);
Як працюють дженерики в C #?
Коли ви оголошуєте загальний код у C #, компілятор створює шаблон, еквівалентний цьому коду. Цей шаблон перевіряється на всі помилки компіляції, крім безпеки типу. Наступний крок відбувається, коли загальний код викликається або викликається в іншій частині програми. Під час виклику ви вказуєте тип, з якого буде складено ваш загальний код. Коли компілятор досягне точки виклику, він вставляє тип, визначений у раніше складеному шаблоні. Потім це перекомпілюється для перевірки на безпеку типу. Після передачі код готовий до виконання.
Ми побачимо складений код у прикладах нижче, щоб краще зрозуміти загальні шаблони.
Приклад генерики в C #
Нижче наведено різні приклади C # Generics:
Дженріки з класом
Код:
using System;
using System.Collections.Generic;
public class GenericClass
(
List genericList;
public GenericClass()
(
genericList = new List();
)
public void AddToList(T item)
(
genericList.Add(item);
)
public void DisplayList()
(
foreach (var ele in genericList)
(
Console.Write("(0)\t", ele);
)
)
)
public class Program
(
public static void Main()
(
GenericClass intGenericObj = new GenericClass();
GenericClass stringGenericObj = new GenericClass();
intGenericObj.AddToList(28);
intGenericObj.AddToList(999);
intGenericObj.AddToList(0);
intGenericObj.AddToList(-123);
intGenericObj.AddToList(100);
stringGenericObj.AddToList("Hello");
stringGenericObj.AddToList("Bonjour");
stringGenericObj.AddToList("Ola");
stringGenericObj.AddToList("Ciao");
stringGenericObj.AddToList("Hallo");
intGenericObj.DisplayList();
Console.WriteLine("\n");
stringGenericObj.DisplayList();
))
Вихід:
Цей же код також можна переписати, як показано нижче. Це ілюструє можливість визначення загального класу, який може бути безпечним для багатьох типів в одному об'єкті.
using System;
using System.Collections.Generic;
public class GenericClass
(
List genericList1;
List genericList2;
public GenericClass()
(
genericList1 = new List();
genericList2 = new List();
)
public void AddToList(T item1, U item2)
(
genericList1.Add(item1);
genericList2.Add(item2);
)
public void DisplayList()
(
foreach (var ele in this.genericList1)
(
Console.Write("(0)\t", ele);
)
Console.WriteLine("\n");
foreach (var ele in this.genericList2)
(
Console.Write("(0)\t", ele);
)
)
)
public class Program
(
public static void Main()
(
GenericClass genericObj = new GenericClass();
genericObj.AddToList(28, "Hello");
genericObj.AddToList(999, "Bonjour");
genericObj.AddToList(0, "Ola");
genericObj.AddToList(-123, "Ciao");
genericObj.AddToList(100, "Hallo");
genericObj.DisplayList();
)
)
Вихід:
Складений код:
Щоб отримати уявлення про те, як вирішується тип даних в Generics, давайте подивимось на компільований код, сформований під час інстанціювання класу з цілими та рядковими типами у наведеному вище прикладі.
using System;
using System.Collections.Generic;
public class GenericClass
(
List genericList1;
List genericList2;
public GenericClass()
(
genericList1 = new List();
genericList2 = new List();
)
public void AddToList(int item1, string item2)
(
genericList1.Add(item1);
genericList2.Add(item2);
)
public void DisplayList()
(
foreach (var ele in this.genericList1)
(
Console.Write("(0)\t", ele);
)
Console.WriteLine("\n");
foreach (var ele in this.genericList2)
(
Console.Write("(0)\t", ele);
)
)
)
public class Program
(
public static void Main()
(
GenericClass genericObj = new GenericClass();
genericObj.AddToList(28, "Hello");
genericObj.AddToList(999, "Bonjour");
genericObj.AddToList(0, "Ola");
genericObj.AddToList(-123, "Ciao");
genericObj.AddToList(100, "Hallo");
genericObj.DisplayList();
)
)
Дженріки з методом
Код:
using System;
using System.Collections.Generic;
public class Program
(
public static void Main()
(
int() intArr = (12, 23, 43, 94, 35);
double() doubleArr = (12.3, 45.6, 98.7, 1.45, 82.653);
string() strArr = ("Hello", "Bonjour", "Ola", "Ciao", "Hallo");
Console.WriteLine("The largest integer in the array is (0)", findMax(intArr));
Console.WriteLine("The largest floating-point number in the array is (0)", findMax(doubleArr));
Console.WriteLine("The largest string in the array is (0)", findMax(strArr));
)
static T findMax(T() items)
where T : IComparable
(
T max = items(0);
int position = 0;
for (int i = 1; i < items.Length; i++)
(
if (items(i).CompareTo(max) > 0)
(
max = items(i);
position = i;
)
)
return max;
)
)
Вихід:
Простір імен System.Collections.Generic
Простір імен System.Collections.Generic у C # містить інтерфейси та класи, що визначають загальні колекції. Вони дозволяють програмістам створювати загальні колекції, які відрізняються кращою продуктивністю та настільки ж сильними типами, як негенеричні колекції.
Цей простір імен містить списки, словники, пов'язані списки, хеші, пари ключових значень, стеки тощо, всі вони мають загальний характер. Програмісти можуть реалізувати їх у своєму коді.
Важливість C # Generics
Нижче наведено значення C # Generics наступним чином:
- Generics Allow Code-Reusability: основний принцип хорошого програмування. Не потрібно писати однаковий код для кожного очікуваного типу даних. Ви просто визначите незалежний від типу код і скажете компілятору, що фактичний тип даних буде надано під час виклику коду.
- Запобігайте витратам на бокс та без боксу: Звичайно, використання дженериків можна обійти через об'єктний клас. Наступні два фрагменти коду рівнозначні у своїх завданнях.
Загальний код: загальнодоступний T MyFunc (пункт T);
Незагальний код: загальнодоступний об'єкт MyFunc (об'єкт)
Клас об'єктів витісняє всі класи і, таким чином, вищевказаний негенеричний код також може бути використаний для створення шаблонів коду, що не залежать від типу.
Але, між двома кодами існує величезна розрив у продуктивності. Використання класу об'єктів вимагає додаткової вартості боксу та розпакування типів даних. Дженерики це усувають і, таким чином, краще в роботі.
Висновок
Таким чином, ми бачили, як дженерики є обов'язковою функцією програмування. Це дуже корисна концепція не тільки на C #, але і в більшості сучасних мов програмування.
Крім того, настійно рекомендується дізнатися про System.Collections.Generic простір імен у C #. Крім того, щоб зрозуміти продуктивність дженериків, поглиблюйтесь у тому, як бокс та розпакування впливають на пам'ять, а також час виконання.
Рекомендовані статті
Це посібник із C # Generics. Тут ми обговорюємо важливість та те, як працюють генерики в C # разом з різними прикладами та реалізацією коду. Ви також можете ознайомитися з іншими запропонованими нами статтями, щоб дізнатися більше -
- Порівняння голову до голови C # або Оператора
- Перевантаження і перезавантаження в Java
- У чому полягає використання методу перевантаження?
- Як працює закритий клас у C #?
- Типи та помилки обробки в JavaScript
- Колекції PL / SQL | Синтаксис, типи, винятки