Udostępnij za pośrednictwem


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, 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 klasie Node.
  • 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#.

Zobacz także