Увод у Ц # Генерике

Дакле, шта је концепт Генерике у Ц #? Једноставним речима, то је концепт дефинисања класа, интерфејса, метода, делегата, својстава, неовисно о типу, итд. То значи да можете дефинисати генеричку класу или тело метода и пружити стварни тип током позива.

Стога су генеричари попут кодних образаца. Омогућавају вам да напишете кодни блок сигуран тип без позивања на било који одређени тип података. Тип вашег кода одређује се у време компилације током позива за вашу класу или методу.

Синтакса генерике у Ц #

Погледајмо синтаксу генеричке декларације у Ц #. То је врло једноставна синтакса.

Као уобичајена пракса, слово „Т“, великим словом и затвореним у кутним заградама, означава декларацију генеричког кода у Ц #. Али, ово није мандат. Свако велико слово у кутним заградама може се користити за означавање Генеричког кода.

Изјава генеричке класе:

public class MyGenericClass

Инстантиатинг Генериц Цласс:

MyGenericClass = new MyGenericClass();

Изјава генеричке изведене класе:

public class MyGenericDerivedClass : MyGenericBaseClass

Изјава генеричке методе:

public T MyGenericMethod(T item);

Како генеричари раде у Ц #?

Када декларишете генерички код у Ц #, преводилац производи предложак еквивалентан том коду. Овај шаблон се провјерава за све грешке у састављању, осим сигурности типа. Сљедећи корак долази када се генерички код позива или позива у другом дијелу програма. У време позива, одредите тип са којим би се састављао ваш генерички код. Када преводилац дође до тачке позива, убацује тип наведен у претходно састављеном предлошку. Затим се поново саставља да би се проверила сигурност типа. Једном када је код спреман за извршење.

Видјели бисмо састављени код у доњим примјерима да бисмо боље разумјели генеричке предлошке.

Пример генеричких записа у Ц #

Испод су различити примери Ц # Генерицса:

Генериц витх Цласс

Шифра:

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();
)
)

Излаз:

Састављен код:

Да бисте добили увид у то како се тип података решава у Генерицима, погледајмо компајлирани код који је генерисан када инстанцирамо класу са целобројним и низовним типовима у горњем примеру.

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;
)
)

Излаз:

Систем.Цоллецтионс.Генериц намеспаце

Систем.Цоллецтионс.Генериц намеспаце у Ц # садржи интерфејсе и класе које дефинишу генеричке колекције. Омогућују програмерима да створе генеричке колекције које су бољих перформанси и једнако снажне као и не генеричке колекције.

Овај простор имена садржи листе, речнике, повезане листе, хешеве, парове кључева и вредности, стакови итд., Који су све генеричке природе. Програмери их могу имплементирати у свом коду.

Важност Ц # генерике

Испод је значај Ц # генерика:

  • Генерике омогућавају поновну употребу кода: основни принцип доброг програмирања. Не морате да пишете исти код за сваку очекивану врсту података. Једноставно дефинирате код неовисан о типу и кажете преводиоцу да ће се стварни тип података пружити у тренутку позива на код.
  • Спречите трошкове бокса и не-бокса: Наравно, употреба генерика се може заобићи кроз класу објеката. Следећа два дела кода су једнака у својим задацима.

Општи код: јавни Т МиФунц (Т ставка);

Нон-Генериц Цоде: јавни објект МиФунц (ставка објекта)

Објектна класа замењује све класе и стога се горе наведени не генерички код такође може користити за генерисање предложака кода независно од типа.

Али, постоји велики јаз у перформансама између два кода. Коришћењем класе објеката долази до додатних трошкова бокса и распакирања типова података. Генеричари то елиминишу и тако су бољи у перформансама.

Закључак

Тако смо видели како генерика мора да се научи од програмирања. Ово је изузетно користан концепт, не само на Ц #, већ и на већини модерних програмских језика.

Надаље, топло се препоручује да сазнате о Систем.Цоллецтионс.Генериц простору имена у Ц #. Такође, да бисте разумели перформансе генерика, дубоко завирите у то како бокс и унбокинг утичу на меморију као и време извршења.

Препоручени чланци

Ово је водич за Ц # Генерицс. Овде смо расправљали о важности и начину рада генерике на Ц #, заједно са различитим примерима и имплементацијом кода. Можете и да прођете кроз друге наше предложене чланке да бисте сазнали више -

  1. Упоређивање Ц # или оператера до главе
  2. Преоптерећење и прегласавање на Јави
  3. Каква је употреба метода преоптерећења?
  4. Како затворена класа ради у Ц #?
  5. Врсте и грешке у руковању у ЈаваСцрипт-у
  6. ПЛ / СКЛ колекције | Синтакса, типови, изузеци

Категорија: