0Pricing
C# Academy · Lektion

Generische Klassen

Wiederverwendbare Container-Typen.

Generische Klassen ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist eine generische Klasse?

Eine generische Klasse deklariert einen oder mehrere Typparameter in spitzen Klammern hinter dem Klassennamen. Diese Parameter können in der gesamten Klasse für Felder, Eigenschaften, Methodensignaturen und Rückgabetypen verwendet werden.

So können Sie einen Container oder Dienst schreiben, der mit vielen Elementtypen funktioniert und dennoch stark typisiert bleibt.

class Box<T>
{
    public T Value { get; set; }
}

Eine generische Klasse instanziieren

Um eine Instanz zu erstellen, geben Sie ein konkretes Typargument an. Box<int> und Box<string> sind unterschiedliche konstruierte Typen.

Jeder konstruierte Typ verhält sich so, als wäre sein T überall durch den tatsächlichen Typ ersetzt worden.

using System;

class Box<T> { public T Value { get; set; } }

class Program
{
    static void Main()
    {
        var b = new Box<int> { Value = 7 };
        Console.WriteLine(b.Value);
    }
}

Generische Felder und Eigenschaften

Typparameter können als Typ von Feldern und Eigenschaften verwendet werden. Ein Stack, eine Queue oder ein Cache speichert seine Daten häufig in einem Array oder einer Liste von T.

Die interne Speicherung bleibt typsicher, ohne dass Typumwandlungen erforderlich sind.

class Pair<T>
{
    public T First;
    public T Second;
}

Mehrere Typparameter

Eine Klasse kann mehrere Typparameter akzeptieren. Ein Schlüssel-Wert-Paar oder ein dictionaryartiger Typ verwendet häufig zwei davon.

Beschreibende Namen wie TKey und TValue verbessern die Lesbarkeit, wenn mehr als einer vorhanden ist.

class Entry<TKey, TValue>
{
    public TKey Key { get; set; }
    public TValue Value { get; set; }
}

Ein einfacher generischer Stack

Hier sehen Sie einen kleinen generischen Stack auf Basis einer List<T>. Push fügt am Ende hinzu, und Pop entfernt das letzte Element.

Dieselbe Klasse funktioniert mit Ganzzahlen, Zeichenfolgen sowie beliebigen Referenz- oder Werttypen.

using System;
using System.Collections.Generic;

class MyStack<T>
{
    private readonly List<T> items = new();
    public void Push(T item) => items.Add(item);
    public T Pop()
    {
        var i = items[^1];
        items.RemoveAt(items.Count - 1);
        return i;
    }
}

class Program
{
    static void Main()
    {
        var s = new MyStack<string>();
        s.Push("a");
        s.Push("b");
        Console.WriteLine(s.Pop());
    }
}

Generische Methoden in generischen Klassen

Eine generische Klasse kann für einzelne Methoden zusätzlich eigene Typparameter deklarieren. Diese Parameter auf Methodenebene sind unabhängig von den Typparametern auf Klassenebene.

Das sorgt für zusätzliche Flexibilität, zum Beispiel beim Konvertieren des gespeicherten Typs in einen anderen Typ.

class Box<T>
{
    public T Value;
    public TOut Map<TOut>(Func<T, TOut> f) => f(Value);
}

Constraints für die Klasse

Wie Methoden kann auch eine generische Klasse ihre Typparameter mit where einschränken. Ein Constraint gilt für jedes Member, das diesen Parameter verwendet.

Unten erlaubt where T : class die Zuweisung von null und Vergleiche von Referenzen.

class Repository<T> where T : class
{
    private T current;
    public bool IsEmpty => current is null;
}

Statische Member gelten pro Typ

Jeder konstruierte generische Typ erhält eine eigene Kopie aller statischen Felder. Counter<int> und Counter<string> verwalten getrennte Zähler.

Das ist ein subtiler, aber wichtiger Unterschied zu nicht generischen Klassen.

class Counter<T>
{
    public static int Count;
}

Standardwerte in generischen Klassen

Innerhalb einer generischen Klasse benötigen Sie häufig einen Anfangswert für ein Feld vom Typ T. Verwenden Sie default(T) oder das kürzere default, wenn der Typ aus dem Kontext bekannt ist.

Für Referenztypen ergibt sich null, für Werttypen der Standardwert.

class Slot<T>
{
    public T Value = default!;
    public bool HasValue { get; private set; }
}

Von einer generischen Klasse erben

Sie können von einer generischen Basisklasse ableiten. Die Unterklasse kann das Typargument festlegen oder selbst generisch bleiben.

Durch das Festlegen wird die Basisklasse spezialisiert; beim Beibehalten als generischer Typ wird der Parameter nach oben weitergereicht.

class Box<T> { public T Value; }

class IntBox : Box<int> { }

class NamedBox<T> : Box<T> { public string Name; }

Generics und die integrierten Collections

Die .NET-Basisklassenbibliothek enthält zahlreiche generische Klassen: List<T>, Dictionary<TKey, TValue> und Queue<T>. Sie zeigen den praktischen Nutzen des Entwurfs generischer Klassen.

Wenn Sie eigene generische Typen schreiben, können Sie denselben sicheren und wiederverwendbaren Ansatz erweitern.

using System.Collections.Generic;

var scores = new Dictionary<string, int>();
scores["ada"] = 95;

Kurztest

Testen Sie Ihr Verständnis generischer Klassen.

Zusammenfassung

Generische Klassen deklarieren Typparameter hinter dem Klassennamen und verwenden sie für Felder, Eigenschaften und Methoden. Sie werden mit konkreten Typargumenten instanziiert, wodurch unterschiedliche Typen entstehen.

Sie können Typparameter auf Methodenebene hinzufügen, where-Constraints enthalten, vererbt werden und einen statischen Zustand pro Typ führen. Integrierte Collections sind das wichtigste Beispiel.

Häufig gestellte Fragen

Ist die Lektion „Generische Klassen“ kostenlos?

Ja — der vollständige Text von „Generische Klassen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Generische Klassen“?

Wiederverwendbare Container-Typen. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Generische Klassen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Generische Methoden
  2. Generische Klassen
  3. where-Einschränkungen
  4. Generische Interfaces
← Zurück zu C# Academy