2

オブジェクトをインターフェイスにキャストするたびに、C# は辞書検索を行いますか? そうしなければならないと思います。

何百ものインターフェイスを実装できる汎用オブジェクト -> GetType() -> 名前 (または予測可能な場所にない数値 ID) でインターフェイスを取得 -> 配列からメソッド ポインターを取得し、キャストされたオブジェクトに保存

4

2 に答える 2

7

次のようなものがあるとします。

object x = whatever;
IFoo y = (IFoo)x;

コンパイラではなくランタイムが、それが成功するか無効なキャスト例外をスローするかを決定する何らかの方法が必要であることに注意してください。

ランタイムがどのようにそうするかの正確な詳細は実装の詳細であり、それは複雑です。ランタイムは、多くのかなり洗練された手法を使用して、このテストが一般的なケースで高速であることを確認します。さらに、CLRの興味深い特徴は、参照IDと値IDが同じものであるということです。タイプテストが成功した場合、xとyに格納されているビットは同じです。(これは通常、C ++には当てはまりません。むしろ、オブジェクトの「ビュー」が異なると、ポインターも異なります。)これは、インターフェイスメソッドのディスパッチを効率的に処理するために、追加のメカニズムを実装する必要があることを意味します。

これらすべてのメカニズムがどのように機能するかを正確に説明するのに十分なCLR内部に関する知識や専門知識がありません。より良い答えが必要な場合は、より具体的な質問をすることができます。

于 2012-12-27T17:27:07.653 に答える
0

これはランタイムとはまったく関係がないと思います。すべてコンパイルフェーズで処理されます。

于 2012-12-27T16:58:38.223 に答える