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.
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.
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
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.
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.
Ich wünschte, ich hätte gesagt, was Unmesh sagte: "Duplikation ist die Wurzel allen Übels." – Jay
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
Es gibt viele Wurzeln allen Übels, wie vorzeitige Optimierung und sogar vorzeitige Verallgemeinerung;) –
See [diese Frage] (http://stackoverflow.com/questions/77632/what-is-cool-about -Generiker-warum-benutzen-sie-. –
Siehe: http://www.csharp-station.com/Tutorials/Lesson20.aspx – kenorb