数日前、オーバーフローに関するこの質問への回答を書いているときに、C# コンパイラが期待どおりの動作をしていないことに少し驚きました。コード スニペットについては、次を参照してください。
初め:
object[] array = new object[1];
for (int i = 0; i < 100000; i++)
{
ICollection<object> col = (ICollection<object>)array;
col.Contains(null);
}
2番:
object[] array = new object[1];
for (int i = 0; i < 100000; i++)
{
ICollection<object> col = array;
col.Contains(null);
}
2 つのスニペットのコードの唯一の違いは、へのキャストICollection<object>
です。object[]
はインターフェイスを明示的に実装しているためICollection<object>
、2 つのスニペットが同じ IL にコンパイルされ、したがって同一になると予想していました。しかし、それらでパフォーマンス テストを実行すると、後者が前者の約 6 倍高速であることがわかりました。
castclass
両方のスニペットの IL を比較した後、最初のスニペットの IL 命令を除いて、両方のメソッドが同一であることに気付きました。
これに驚いて、なぜ C# コンパイラがここで「スマート」でないのか疑問に思います。物事は見かけほど単純ではないのに、なぜ C# コンパイラはここで少しナイーブなのでしょうか?