Generischer syntaktischer Zucker oder echte Verbesserung

8

Ich habe eine Frage bezüglich der folgenden Methodenaufrufe:

%Vor%

Hier ist IL für diese beiden Aufrufe:

%Vor%

Ich habe immer gedacht, dass in dieser Situation die generische Version dieser Methode mehr "syntaktischer Zucker" war als echte Verbesserung. Erzählt das IL eine andere Geschichte?

    
Pat Lindley 29.12.2011, 20:24
quelle

2 Antworten

8

Generics sind in C # integriert, also ist es eine "echte Verbesserung". Daher ist die Laufzeitkovarianz und die Kontravarianz ebenso möglich wie die Reflexion über generische Typen und die reflektionsbasierte Erstellung von generischen Typen (z. B. List<T> , wobei T zur Laufzeit bestimmt wird) / p>

Dies unterscheidet sich von C ++, wo Templates in vielerlei Hinsicht syntaktischer Zucker sind. Der Compiler generiert Code für jeden generischen Typ, den Sie verwenden - also würde Add<T> Add<int> , Add<long> , Add<short> , Add<MyClass> usw. erstellen, wenn Sie diese Funktionen verwenden, und ebenso für Klassen. Der Vorteil davon sind in erster Linie Operatoren und ein paar andere kleinere Dinge - wenn jeder dieser Typen einen Operator + hat und Add<T>(T a, T b) a + b zurückgibt, werden alle Typen gut funktionieren. Der Compiler von C # würde sich beschweren, weil er die Deklaration des Operators für all-and-all-Typen zum Zeitpunkt der Kompilierung nicht auflösen kann. Darüber hinaus erzeugt C # (nicht 100% sicher, aber vielleicht 90%) eine generische Typimplementierung für Referenztypen (wenn Sie diese Implementierung verwenden) und dann 1 für jeden Werttyp (so int, long, Dezimal, MyStruct usw.) nach Bedarf eigene Implementierungen erhalten.)

    
GGulati 29.12.2011, 20:31
quelle
2

In Java sind Generika syntaktischer Zucker, aber in c # sind sie eingebaut. Schau dir das an: www.25hoursaday.com/CSharpVsJava.html

    
prongs 29.12.2011 20:38
quelle

Tags und Links