2010-08-31 11 views
24

Ich schaute auf einige Beispielcode mit C# Generika. Warum und wann sollte ich sie benutzen?Understanding C# Generika viel besser

Alle Beispiele waren komplex. Ich brauche ein einfaches, klares Beispiel, das mich mit C# Generika beginnt.

+8

See [diese Frage] (http://stackoverflow.com/questions/77632/what-is-cool-about -Generiker-warum-benutzen-sie-. –

+0

Siehe: http://www.csharp-station.com/Tutorials/Lesson20.aspx – kenorb

Antwort

50

Ein sehr einfaches Beispiel ist die generische List<T> Klasse. Es kann eine Anzahl von Objekten eines beliebigen Typs enthalten. Zum Beispiel können Sie eine Liste von Zeichenfolgen (new List<string>()) oder eine Liste von Tieren (new List<Animal>()) deklarieren, weil es generisch ist.

Was wäre, wenn Sie keine Generika verwenden könnten? Sie könnten die ArrayList Klasse verwenden, aber der Nachteil ist, dass es Typ enthält eine object ist. Wenn Sie also über die Liste iterieren, müssten Sie jedes Element in den richtigen Typ (entweder string oder Animal) umwandeln, was mehr Code ist und eine Leistungseinbuße bedeutet. Plus, da ein ArrayList Objekte hält, ist es nicht typsicher. Sie könnten noch ein Animal zu einem ArrayList von Strings hinzuzufügen:

ArrayList arrayList = new ArrayList(); 
arrayList.Add(new Animal()); 
arrayList.Add(""); 

Also, wenn eine Arraylist iterieren würden Sie den Typ überprüfen müssen sicherstellen, dass die Instanz eines bestimmten Typs, die in einem schlechten Code ergibt:

foreach (object o in arrayList) 
{ 
    if(o is Animal) 
    ((Animal)o).Speak(); 
} 

mit einem generischen List<string> ist dies einfach nicht möglich:

List<string> stringList = new List<String>(); 
stringList.Add("Hello"); 
stringList.Add("Second String"); 
stringList.Add(new Animal()); // error! Animal cannot be cast to a string 
+3

Gute Antwort. Einfach zu folgen. – RKh

+0

+1 für die Fähigkeit, ein schönes, sauberes und nicht-komplexes Beispiel zu geben. Gut gemacht. – Subby

+0

jetzt das ist, was wir eine grundlegende Erklärung nennen, mit fantastischen Beispielen, Echtzeit-Code-Snippet. Groß. +1 – Kings

0

auf den Punkt gebracht, Generika können Sie Klassen schreiben tha t Arbeiten mit Objekten aller Art, ohne dass die Daten in Object umgewandelt werden müssen. Dies hat zwar Leistungsvorteile, macht Ihren Code aber auch lesbarer, wartbarer und weniger fehleranfällig.

Sie sollten immer Generics im Gegensatz zu den .NET 1.1-Stilklassen verwenden, wenn möglich.

5

Um weitere Antworten mit einem gewissen Schwerpunkt zusammenfassen:

1) Generika ermöglichen es Ihnen, ‚allgemeinen‘ Code (das heißt, es wird funktionieren für mehrere Arten) zu schreiben. Wenn Sie ein "generisches" Verhalten haben, das Sie schreiben möchten und das Sie sich für unterschiedliche Datentypen verhalten müssen, müssen Sie diesen Code nur einmal schreiben. Das Beispiel der Liste ist ein gutes Beispiel, können Sie eine Liste von vielleicht Kunden, Produkte, Bestellungen, Lieferanten müssen ... alle den gleichen Code für jede Art

// snippet 
List<Customer> customers = new List<Customer>(); 
Customer thisCustomer = new Customer(); 
customers.Add(thisCustomer); 

List<Order> orders = new List<Order>(); 
Order thatOrder = new Order(); 
orders.Add(thatOrder); 

// etc. 

2) erstaunlich instanziiert mit Generika noch Typsicherheit ermöglichen ! Also, wenn Sie dies versuchen, werden Sie zu Recht eine Fehlermeldung erhalten:

// continued for snippet above 
Order anotherOrder = new Order(); 
customers.Add(anotherOrder); // FAIL! 

Und Sie würden, dass ein Fehler sein wollen, so dass sie später auf Ihrem Kundenverarbeitungscode nicht eine falsche Reihenfolge zeigt, bis zu handhaben hat in die Kundenliste.

+0

Ich wünschte, ich hätte gesagt, was Unmesh sagte: "Duplikation ist die Wurzel allen Übels." – Jay

3

Duplikation ist die Wurzel allen Übels. Ein Fall der Code-Duplizierung tritt auf, wenn Sie dieselbe Operation für verschiedene Datentypen ausführen müssen. Generika können Sie vermeiden, indem Sie Code um einen generischen Typ codieren und ihn später durch bestimmte Typen ersetzen.

Die andere Lösung für dieses Problem besteht darin, Variablen des Typs 'System.Object' zu verwenden, denen ein beliebiges Objekt zugewiesen werden kann. Diese Methode umfasst Boxen und Unboxing-Operationen zwischen Wert und Referenztypen, die die Leistung beeinträchtigen.Außerdem verhindert das Typ-Casting, dass der Code sauber ist.

Generics werden in MSIL und der CLR unterstützt, wodurch sie wirklich gut funktioniert.

Sie sollten diese Artikel über Generika lesen -

http://msdn.microsoft.com/en-us/library/512aeb7t(VS.80).aspx

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx#csharp_generics_topic1

+2

Es gibt viele Wurzeln allen Übels, wie vorzeitige Optimierung und sogar vorzeitige Verallgemeinerung;) –