C # Generics - Примеры и как работают дженерики в C #

Содержание:

Anonim

Введение в 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 следующим образом:

  • Обобщения позволяют повторно использовать код: фундаментальный принцип хорошего программирования. Вам не нужно писать один и тот же код для каждого ожидаемого типа данных. Вы просто определяете независимый от типа код и сообщаете компилятору, что фактический тип данных будет предоставлен во время вызова кода.
  • Предотвращение затрат на упаковку и распаковку: Конечно, использование обобщения может быть обойдено с помощью класса объекта. Приведенные ниже две части кода эквивалентны в своих задачах.

Общий код: общедоступный T MyFunc (T item);

Неуниверсальный код: открытый объект MyFunc (объект item)

Класс объекта заменяет все классы, и, таким образом, вышеупомянутый неуниверсальный код также может использоваться для генерирования независимых от типа шаблонов кода.

Но между двумя кодами существует огромный разрыв в производительности. Использование класса объекта влечет за собой дополнительные затраты на упаковку и распаковку типов данных. Дженерики устраняют это и, следовательно, лучше в производительности.

Вывод

Таким образом, мы увидели, что дженерики являются обязательной функцией программирования. Это очень полезная концепция не только в C #, но и в большинстве современных языков программирования.

Кроме того, настоятельно рекомендуется узнать о пространстве имен System.Collections.Generic в C #. Кроме того, чтобы понять производительность шаблонов, погрузитесь в то, как бокс и распаковка влияют на память и время выполнения.

Рекомендуемые статьи

Это руководство по C # Generics. Здесь мы обсуждаем важность и работу универсальных шаблонов в C #, а также различные примеры и реализацию кода. Вы также можете просмотреть наши другие предлагаемые статьи, чтобы узнать больше -

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