Generics in C#: Wozu sie dienen und wie man sie 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

Einführung in Generics in C#



Generics (generische Typen) sind eine der leistungsstärksten Funktionen der C#-Sprache, eingeführt in .NET Framework 2.0. Sie ermöglichen es Ihnen, Klassen, Methoden und Schnittstellen zu erstellen, die mit jedem Datentyp arbeiten, während sie eine starke Typisierung beibehalten. In diesem Artikel werden wir untersuchen, warum Generics in C# benötigt werden, wie man sie verwendet und welche Vorteile sie Entwicklern bieten.



Stellen Sie sich vor, Sie müssen eine Methode schreiben, um die Werte zweier Variablen zu tauschen. Ohne Generics müssten Sie separate Methoden für jeden Typ erstellen: SwapInt, SwapString, SwapDouble und so weiter. Mit Generics wird diese Aufgabe mit einer einzigen universellen Funktion gelöst.



Wichtige Vorteile von Generics



1. Typsicherheit zur Compile-Zeit



Generics bieten Typprüfung zur Compile-Zeit anstatt zur Laufzeit. Das bedeutet, dass Fehler im Zusammenhang mit Typinkompatibilitäten früh im Entwicklungsprozess erkannt werden.



// Ohne Generics - möglicher LaufzeitfehlerArrayList list = new ArrayList();list.Add(123);list.Add("string");int number = (int)list[1]; // InvalidCastException!

// Mit Generics - Fehler zur Compile-ZeitList<int> numbers = new List<int>();numbers.Add(123);numbers.Add("string"); // Fehler zur Compile-Zeit!


2. Leistung



Die Verwendung von Generics vermeidet Boxing- und Unboxing-Operationen für Werttypen. Dies verbessert die Leistung beim Arbeiten mit Sammlungen erheblich.



// Boxing/Unboxing - langsamArrayList list = new ArrayList();list.Add(42); // boxingint value = (int)list[0]; // unboxing

// Generics - schnell, kein BoxingList<int> list = new List<int>();list.Add(42); // kein Boxingint value = list[0]; // kein Unboxing


3. Code-Wiederverwendbarkeit



Eine einzige generische Klasse oder Methode kann mit jedem Datentyp arbeiten, wodurch Code-Duplizierung vermieden wird.



Erstellen und Verwenden von Generics



Generische Klassen



Betrachten Sie ein Beispiel für die Erstellung einer generischen Klasse zum Speichern eines Wertepaars:



public class Pair<TFirst, TSecond>{    public TFirst First { get; set; }    public TSecond Second { get; set; }        public Pair(TFirst first, TSecond second)    {        First = first;        Second = second;    }        public void Display()    {        Console.WriteLine($"First: {First}, Second: {Second}");    }}

// Verwendungvar pair1 = new Pair<int, string>(1, "one");var pair2 = new Pair<string, double>("PI", 3.14159);

pair1.Display(); // First: 1, Second: onepair2.Display(); // First: PI, Second: 3.14159


Generische Methoden



Methoden können ebenfalls generisch sein. Hier ist ein klassisches Beispiel — eine Tauschmethode:



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

// Verwendungint x = 5, y = 10;Swap<int>(ref x, ref y);Console.WriteLine($"x = {x}, y = {y}"); // x = 10, y = 5

string s1 = "Hello", s2 = "World";Swap(ref s1, ref s2); // Typ kann weggelassen werdenConsole.WriteLine($"s1 = {s1}, s2 = {s2}"); // s1 = World, s2 = Hello


Generische Schnittstellen



Schnittstellen mit Generics ermöglichen die Erstellung flexibler Verträge:



public interface IRepository<T>{    T GetById(int id);    void Add(T entity);    void Update(T entity);    void Delete(int id);}

public class UserRepository : IRepository<User>{ public User GetById(int id) { // Implementierung zum Abrufen eines Benutzers return new User(); } public void Add(User user) { // Implementierung zum Hinzufügen } public void Update(User user) { // Implementierung zum Aktualisieren }

Blogs

Buchempfehlungen