Quelques jours en arrière, lors de l'écriture d'une réponse à cette question ici sur le dépassement je me suis un peu surpris par le compilateur C#, qui n'était pas de faire ce que j'ai prévu de faire. Regardez les suivantes pour les extraits de code:
D'abord:
object[] array = new object[1];
for (int i = 0; i < 100000; i++)
{
ICollection<object> col = (ICollection<object>)array;
col.Contains(null);
}
Deuxième:
object[] array = new object[1];
for (int i = 0; i < 100000; i++)
{
ICollection<object> col = array;
col.Contains(null);
}
La seule différence de code entre les deux extraits est le casting de ICollection<object>. Parce que l'objet[] implémente l'ICollection<objet> interface explicitement, je m'attendais à les deux fragments de code à compiler vers le bas pour la même chose IL et donc être identiques. Cependant, lors de l'exécution de tests de performance sur eux, j'ai remarqué que celle-ci soit environ 6 fois plus rapide que l'ancien.
Après avoir comparé le IL de les deux extraits, j'ai remarqué que les deux méthodes sont identiques, sauf pour un castclass instruction IL dans le premier extrait.
Surpris par ce que je me demande maintenant pourquoi le compilateur C# n'est pas "intelligent" de la ici. Les choses ne sont jamais aussi simple qu'il y paraît, alors pourquoi est le compilateur C# un peu naïf ici?