Klasy ogólne i metody
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 przy użyciu ogólnego parametru T
typu można napisać pojedynczą klasę, której może używać inny kod klienta bez ponoszenia kosztów lub ryzyka rzutowania środowiska uruchomieniowego lub operacji boksu, jak pokazano poniżej:
// 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 element T
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 klas kolekcji opartych na rodzajach. 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 (Typy ogólne na platformie .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 udostępnionej przez platformę List<T> .NET zamiast tworzyć własne). Parametr T
typu jest używany w kilku lokalizacjach, w których typ betonowy zwykle będzie używany do wskazania typu elementu przechowywanego na liście:
- Jako typ parametru metody w metodzie
AddHead
. - Jako zwracany
Data
typ właściwości w zagnieżdżonejNode
klasie. - Jako typ składowej prywatnej
data
w zagnieżdżonej klasie.
T
jest dostępny dla klasy zagnieżdżonej Node
. Gdy GenericList<T>
wystąpienie jest tworzone przy użyciu konkretnego typu, na przykład jako GenericList<int>
, każde wystąpienie T
elementu jest zastępowane elementem 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
Typy ogólne nie są ograniczone do klas. Powyższe przykłady używają class
typów, ale można zdefiniować typy ogólne interface
i struct
typy, w tym record
typy.
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 System.Collections.Generic przestrzeni nazw. 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 w czasie wykonywania można uzyskać na typach używanych w typie danych ogólnych przy użyciu odbicia.
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#.