Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Typy ogólne wprowadza pojęcie parametrów typu do platformy .NET. Typy ogólne umożliwiają projektowanie klas i metod odroczenia specyfikacji co najmniej jednego parametru typu do momentu użycia klasy lub metody w kodzie. Na przykład, używając parametru typu ogólnego T
, można napisać pojedynczą klasę, której kod klienta może używać bez ponoszenia kosztów lub ryzyka rzutowania w czasie uruchamiania czy operacji pakowania, jak pokazano tutaj.
// 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());
}
}
Klasy ogólne i metody łączą możliwość ponownego wykorzystania, bezpieczeństwo typów i wydajność w taki sposób, że ich niegeneryczne odpowiedniki nie mogą. Parametry typu ogólnego są zastępowane argumentami typu podczas kompilacji. W poprzednim przykładzie kompilator zastępuje ciąg T
ciągiem int
. Typy ogólne są najczęściej używane z kolekcjami i metodami, które na nich działają.
System.Collections.Generic Przestrzeń nazw zawiera kilka generycznych klas kolekcji. Kolekcje niegeneryczne, takie jak ArrayList nie są zalecane i są przechowywane tylko w celach zgodności. Aby uzyskać więcej informacji, zobacz Generics in .NET.
Można również utworzyć niestandardowe typy ogólne i metody, aby zapewnić własne uogólnione rozwiązania i wzorce projektowe, które są bezpieczne i wydajne. Poniższy przykład kodu przedstawia prostą ogólną klasę listy połączonej do celów demonstracyjnych. (W większości przypadków należy użyć klasy List<T> udostępnianej przez platformę .NET, zamiast tworzyć własną). Parametr typu T
jest używany w kilku miejscach, gdzie zwykle stosuje się konkretny typ do określenia typu elementu na liście.
- Jako typ parametru metody w metodzie
AddHead
. - Typ zwracany przez właściwość
Data
w zagnieżdżonej klasieNode
. - Typ prywatnego członka
data
w klasie zagnieżdżonej.
T
jest dostępny w zagnieżdżonej klasie Node
. Gdy GenericList<T>
jest tworzony z użyciem konkretnego typu, na przykład jako GenericList<int>
, każde wystąpienie T
jest zastępowane 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;
}
}
}
Poniższy przykład kodu pokazuje, jak kod klienta używa klasy ogólnej GenericList<T>
do utworzenia listy liczb całkowitych. Jeśli zmienisz argument typu, poniższy kod tworzy listy ciągów lub dowolnego innego typu niestandardowego:
// 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");
Uwaga / Notatka
Typy ogólne nie są ograniczone do klas. Powyższe przykłady używają class
typ, ale można zdefiniować typy ogólne interface
i struct
, w tym record
.
Omówienie typów ogólnych
- Użyj typów ogólnych, aby zmaksymalizować ponowne użycie kodu, bezpieczeństwo typów i wydajność.
- Najczęstszym zastosowaniem typów ogólnych jest tworzenie klas kolekcji.
- Biblioteka klas platformy .NET zawiera kilka ogólnych klas kolekcji w przestrzeni nazw System.Collections.Generic. Kolekcje ogólne powinny być używane zawsze, gdy jest to możliwe, zamiast klas, takich jak ArrayList w System.Collections przestrzeni nazw.
- Możesz utworzyć własne interfejsy ogólne, klasy, metody, zdarzenia i delegaty.
- Klasy ogólne można ograniczyć, aby umożliwić dostęp do metod dla określonych typów danych.
- Informacje o typach używanych w typie danych ogólnych można uzyskać w czasie wykonywania przy użyciu refleksji.
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#.