Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Дженерики вводят концепцию параметров типа в .NET. Универсальные шаблоны позволяют создавать классы и методы, откладывающие спецификацию одного или нескольких параметров типа, пока не будет использоваться класс или метод в коде. Например, используя параметр Tуниверсального типа, можно написать один класс, который другой клиентский код может использовать, не вызывая затраты или риски приведения среды выполнения или операций бокса, как показано ниже:
// Declare the generic class.
public class GenericList<T>
{
public void Add(T item) { }
}
public class ExampleClass { }
class TestGenericList
{
static void Main()
{
// Create a list of type int.
GenericList<int> list1 = new();
list1.Add(1);
// Create a list of type string.
GenericList<string> list2 = new();
list2.Add("");
// Create a list of type ExampleClass.
GenericList<ExampleClass> list3 = new();
list3.Add(new ExampleClass());
}
}
Универсальные классы и методы объединяют повторное использование, безопасность типов и эффективность таким образом, что их негенерические аналоги не могут. Параметры универсального типа заменяются аргументами типа во время компиляции. В предыдущем примере компилятор заменяет T на int. Дженерики чаще всего используются с коллекциями и методами, которые работают с ними. Пространство System.Collections.Generic имен содержит несколько универсальных классов коллекций. Негенерические коллекции, такие как ArrayList не рекомендуется и поддерживаются только в целях совместимости. Дополнительные сведения см. в разделе Generics in .NET.
Вы также можете создать пользовательские универсальные типы и методы, чтобы предоставить собственные обобщенные решения и шаблоны проектирования, которые являются типобезопасными и эффективными. В следующем примере кода показан простой универсальный класс связанного списка для демонстрационных целей. (В большинстве случаев следует использовать класс, предоставленный List<T> .NET, вместо создания собственного.) Параметр T типа используется в нескольких расположениях, где конкретный тип обычно используется для указания типа элемента, хранящегося в списке:
- Тип параметра метода в методе
AddHead. - В качестве возвращаемого типа свойства
Dataво вложенном классеNode. - Тип частного члена
dataв вложенном классе.
T доступен для вложенного Node класса. При создание экземпляра GenericList<T> с конкретным типом, например, как GenericList<int>, каждое вхождение T заменяется на int.
// Type parameter T in angle brackets.
public class GenericList<T>
{
// The nested class is also generic, and
// holds a data item of type T.
private class Node(T t)
{
// T as property type.
public T Data { get; set; } = t;
public Node? Next { get; set; }
}
// First item in the linked list
private Node? head;
// T as parameter type.
public void AddHead(T t)
{
Node n = new(t);
n.Next = head;
head = n;
}
// T in method return type.
public IEnumerator<T> GetEnumerator()
{
Node? current = head;
while (current is not null)
{
yield return current.Data;
current = current.Next;
}
}
}
В следующем примере кода показано, как клиентский код использует универсальный GenericList<T> класс для создания списка целых чисел. При изменении аргумента типа следующий код создает списки строк или любого другого пользовательского типа:
// A generic list of int.
GenericList<int> list = new();
// Add ten int values.
for (int x = 0; x < 10; x++)
{
list.AddHead(x);
}
// Write them to the console.
foreach (int i in list)
{
Console.WriteLine(i);
}
Console.WriteLine("Done");
Замечание
Универсальные типы не ограничиваются классами. В предыдущих примерах используются class типы, но можно определить универсальные interface и struct типы, включая record типы.
Общие сведения о универсальных шаблонах
- Используйте универсальные типы для повышения повторного использования кода, безопасности типов и производительности.
- Наиболее распространенное использование универсальных шаблонов — создание классов коллекций.
- Библиотека классов .NET содержит несколько универсальных классов коллекций в пространстве имен System.Collections.Generic. Универсальные коллекции следует использовать всякий раз, когда это возможно, вместо классов, таких как ArrayList в System.Collections пространстве имен.
- Вы можете создавать собственные универсальные интерфейсы, классы, методы, события и делегаты.
- Универсальные классы можно ограничить, чтобы обеспечить доступ к методам для определенных типов данных.
- Вы можете получить сведения во время выполнения о типах, используемых в универсальном типе данных, с помощью отражения.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#.