Ein paar Tage zurück, während ich eine Antwort für this question hier auf Überlauf schrieb, wurde ich ein bisschen vom C# -Compiler überrascht, wer nicht tat, was ich erwartete, es zu tun. Schauen Sie sich den folgenden Code-Schnipsel:C# -Compiler optimiert nicht unnötige Umwandlungen
Erstens:
object[] array = new object[1];
for (int i = 0; i < 100000; i++)
{
ICollection<object> col = (ICollection<object>)array;
col.Contains(null);
}
Zweitens:
object[] array = new object[1];
for (int i = 0; i < 100000; i++)
{
ICollection<object> col = array;
col.Contains(null);
}
Der einzige Unterschied im Code zwischen den beiden Schnipsel ist die Besetzung zu ICollection < object>. Da object [] die ICollection < object> interface explizit implementiert, erwartete ich, dass die beiden Snippets auf dieselbe IL kompiliert werden und daher identisch sind. Wenn ich jedoch Leistungstests mit ihnen durchführte, bemerkte ich, dass das Letztere etwa 6 mal so schnell war wie das Erste.
Nach dem Vergleich der IL aus beiden Schnipsel, bemerkte ich, dass beide Methoden identisch waren, mit Ausnahme einer ILA-Anweisung im ersten Snippet.
Überrascht von diesem frage ich mich jetzt, warum der C# -Compiler hier nicht 'schlau' ist. Die Dinge sind nie so einfach wie es scheint, warum ist der C# -Compiler hier ein bisschen naiv?
Welche Compiler-Optionen verwenden Sie? – Richard
Im Freigabemodus kompiliert (Optimierungscode ist aktiviert). – Steven