C # Generics - Примери и как генериците работят в C #

Съдържание:

Anonim

Въведение в C # Generics

И така, каква е концепцията на Generics в C #? С прости думи, това е концепцията за определяне на независими от типа класове, интерфейси, методи, делегати, свойства и т.н. Това означава, че можете да определите генеричен клас или тяло на метод и да предоставите действителния тип по време на извикване.

Така Generics са като кодови шаблони. Те ви позволяват да напишете защитен от тип код код, без да се позовавате на конкретен тип данни. Типът на вашия код се определя по време на компилиране по време на повикване за повикване за вашия клас или метод.

Синтаксис на генерични символи в C #

Нека да разгледаме синтаксиса на родовата декларация в C #. Това е много прост синтаксис.

Като обичайна практика буквата „T“ в главната и затворена в ъглови скоби обозначава декларацията на общ код в 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 #, заедно с различни примери и реализация на код. Можете да разгледате и другите ни предложени статии, за да научите повече -

  1. Сравнение от главата до главата на C # или оператор
  2. Претоварване и отмяна в Java
  3. Какво е използването на метода за претоварване?
  4. Как работи запечатаният клас в C #?
  5. Видове и обработка на грешки в JavaScript
  6. PL / SQL колекции | Синтаксис, типове, изключения