Generics in C#: wozu sie dienen und wie man sie für Anfänger verwendet

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Generics in C#: wozu sie dienen und wie man sie verwendet

\n\n

Bei der Entwicklung in C# stößt früher oder später jeder auf die Situation, dass derselbe Algorithmus auf verschiedene Datentypen angewendet werden muss. Früher musste man dafür entweder mehrere Versionen einer Methode schreiben oder den Typ object verwenden, was zu Leistungseinbußen und dem Risiko von Fehlern führte. Die Lösung für dieses Problem sind Generics (generische Typen). In diesem Artikel werden wir uns ansehen, was Generics sind, wozu sie dienen und wie man sie in C# richtig verwendet.

\n\n

Was sind Generics in C#?

\n\n

Generics (Verallgemeinerungen) sind ein Mechanismus der Sprache C#, der es ermöglicht, Klassen, Methoden, Schnittstellen und Delegaten zu erstellen, die mit verschiedenen Datentypen arbeiten, ohne dabei die strenge Typisierung zu verlieren. Anstatt den Code für jeden Typ separat zu schreiben, erstellen Sie eine universelle Vorlage, die den benötigten Typ zur Kompilierzeit einsetzt.

\n\n

Stellen Sie sich vor, Sie müssen eine Methode zum Vertauschen der Werte zweier Variablen schreiben. Ohne Generics müssten Sie separate Methoden für int, string, double usw. erstellen. Mit Generics schreiben Sie eine Methode, die mit jedem Typ funktioniert.

\n\n

Hier ist ein einfaches Beispiel für die Deklaration einer generischen Methode:

\n\n
public void Swap<T>(ref T a, ref T b)\n{\n    T temp = a;\n    a = b;\n    b = temp;\n}
\n\n

Hier ist <T> der Typparameter. Der Buchstabe T ist die allgemein übliche Bezeichnung (von Type), aber Sie können jeden beliebigen Namen verwenden. Wenn Sie die Methode aufrufen, geben Sie den konkreten Typ an:

\n\n
int x = 5, y = 10;\nSwap<int>(ref x, ref y);\n// Jetzt ist x = 10, y = 5\n\nstring first = "Hallo", second = "Welt";\nSwap<string>(ref first, ref second);\n// Jetzt ist first = "Welt", second = "Hallo"
\n\n

Wozu dienen Generics: die wichtigsten Vorteile

\n\n

Die Verwendung von Generics bietet mehrere wichtige Vorteile, die den Code besser und sicherer machen.

\n\n

1. Typsicherheit (Type Safety)

\n

Im Gegensatz zur Verwendung von object überprüfen Generics die Typen bereits zur Kompilierzeit. Sie können nicht versehentlich einen String dort übergeben, wo eine Zahl erwartet wird. Der Compiler weist sofort auf den Fehler hin.

\n\n

2. Leistung

\n

Bei der Verwendung von object findet ein Boxing (Verpacken) von Werttypen (int, double, struct) in einen Referenztyp und ein anschließendes Unboxing (Entpacken) statt. Dies sind aufwändige Operationen. Generics eliminieren diese Prozesse vollständig, da der Compiler für jeden Typ spezialisierten Code generiert.

\n\n

3. Wiederverwendbarkeit von Code

\n

Sie müssen nicht denselben Algorithmus für verschiedene Typen schreiben. Eine generische Klasse oder Methode kann mit Tausenden verschiedener Typen arbeiten.

\n\n

4. Lesbarkeit und Wartbarkeit

\n

Der Code wird sauberer und verständlicher. Sie sehen deutlich, mit welchen Typen die Methode oder Klasse arbeitet, und die Logik ist von den konkreten Datentypen getrennt.

\n\n

Wie man Generics verwendet: praktische Beispiele

\n\n

Betrachten wir einige reale Szenarien für die Verwendung von Generics in C#.

\n\n

Generische Klassen

\n

Das häufigste Beispiel sind Sammlungen. Anstatt eine eigene Klasse zum Speichern einer Liste von Zahlen, Zeichenfolgen oder benutzerdefinierten Objekten zu erstellen, verwenden Sie List<T>:

\n\n
List<int> numbers = new List<int>();\nnumbers.Add(1);\nnumbers.Add(2);\n\nList<string> names = new List<string>();\nnames.Add("Alice");\nnames.Add("Bob");\n\n// Ihre eigene generische Klasse\npublic class Repository<T>\n{\n    private List<T> _items = new List<T>();\n\n    public void Add(T item) => _items.Add(item);\n    public T Get(int index) => _items[index];\n}\n\nRepository<int> intRepo = new Repository<int>();\nintRepo.Add(100);\nint value = intRepo.Get(0); // 100
\n\n

Generische Methoden

\n

Methoden können auch innerhalb normaler Klassen generisch sein:

\n

Blogs

Buchempfehlungen