Wenn Sie eine Methode haben oder Foo<T>
eingeben, dann kann die CLR mehrere Versionen für verschiedene T kompilieren. Ich weiß, dass alle Referenztypen die gleiche Version haben. Wie funktioniert es für Strukturen? Wird Code manchmal für verschiedene Strukturen freigegeben oder nie geteilt? Ich könnte mir vorstellen, dass Code beispielsweise für alle Strukturen derselben Größe gemeinsam genutzt wird.Wann ist Code für verschiedene Instanzen von Generika in der CLR freigegeben?
Ich bin interessiert, weil ich über das folgende Beispiel ich Frage:
interface IBar
{
void DoBar();
}
struct Baz : IBar
{
public void DoBar(){ ... }
}
struct Quux : IBar
{
public void DoBar(){ ... }
}
Nun, wenn ich folgendes tun:
public void ExecuteBar<T>(T bar) where T:IBar
{
bar.DoBar();
}
ExecuteBar(new Baz());
ExecuteBar(new Quux());
Wird diese erzeugen zwei Versionen von ExecuteBar
, die jeweils mit einem direkter (nicht virtueller) Anruf direkt an Bar.DoBar()
und Quux.DoBar()
? Oder wird der Versand zur Laufzeit ausgeführt?
Korrigieren. Also denke ich, dass auf der Ebene, an der sich der Fragesteller interessiert, die Antwort lautet: Bei der ersten Alternative werden zwei verschiedene Methoden erstellt, eine für jeden der Werttypen, und der Versand ist nicht virtuell. –
Danke! @ Jeppe: Ja, tatsächlich. Es kann der Fall sein, dass der Code durch Inlining weiter optimiert wird, und das wäre noch effizienter, aber ich interessierte mich für das Basisleistungsmodell von Schnittstellenaufrufen auf Strukturen, deren Typ explizit als Parameter an eine generische Methode oder Klasse übergeben wird . Ich weiß, dass Sie sich nicht auf dieses Verhalten verlassen sollten, aber es kann als Ausgangspunkt für die Optimierung dienen. Wenn ein Versand den Code verlangsamt, kann es sinnvoll sein, eine Klasse in eine Struktur zu ändern, um den Versand zu vermeiden. – Jules