Reflection インターフェイスを経由しない限り、すべてが C# で事前にバインドされます。
アーリー バインドとは、ターゲット メソッドがコンパイル時に検出され、これを呼び出すコードが作成されることを意味します。仮想かどうか (呼び出し時にそれを見つけるための余分なステップがあることを意味します) は関係ありません)。メソッドが存在しない場合、コンパイラはコードのコンパイルに失敗します。
レイト バウンドとは、ターゲット メソッドが実行時に検索されることを意味します。多くの場合、メソッドのテキスト名を使用して検索します。メソッドがそこにない場合は、強打します。プログラムは実行時にクラッシュするか、何らかの例外処理スキームに入ります。
ほとんどのスクリプト言語は遅延バインディングを使用し、コンパイル済み言語は事前バインディングを使用します。
C# (バージョン 4 より前) は遅延バインドしません。ただし、リフレクション API を使用してそれを行うことはできます。この API は、実行時にアセンブリを調べて関数名を検索するコードにコンパイルされます。Option Strict がオフになっている場合、VB は遅延バインドできます。
通常、バインドはパフォーマンスに影響します。レイト バインディングは実行時にルックアップを必要とするため、通常、メソッド呼び出しはアーリー バインドされたメソッド呼び出しよりも遅いことを意味します。
通常の関数の場合、コンパイラはメモリ内の数値位置を計算できます。次に、関数が呼び出されると、このアドレスで関数を呼び出す命令を生成できます。
仮想メソッドを持つオブジェクトの場合、コンパイラは v-table を生成します。これは基本的に、仮想メソッドのアドレスを含む配列です。仮想メソッドを持つすべてのオブジェクトには、v テーブルのアドレスであるコンパイラによって生成された非表示のメンバーが含まれます。仮想関数が呼び出されると、コンパイラは v テーブル内の適切なメソッドの位置を判断します。次に、オブジェクトの v-table を調べて、この位置で仮想メソッドを呼び出すコードを生成します。
そのため、仮想機能に対して発生するルックアップがあります。これは非常に最適化されているため、実行時に非常に迅速に行われます。
アーリーバウンド
- コンパイラは、呼び出された関数がコンパイル時にどこにあるかを判断できます。
- コンパイラは、関数が存在し、実行時に呼び出し可能であることを早い段階 (プログラム コードが実行される前) に保証できます。
- コンパイラは、関数が正しい数の引数を取り、それらが正しい型であることを保証します。また、戻り値が正しい型であることも確認します。
遅延バインディング
- 単純なオフセット計算ではなく、通常はテキスト比較が行われるため、検索に時間がかかります。
- 対象の機能が存在しない可能性があります。
- ターゲット関数は、渡された引数を受け入れない可能性があり、間違った型の戻り値を持つ可能性があります。
- 一部の実装では、実行時にターゲット メソッドが実際に変更される場合があります。そのため、ルックアップは別の機能を実行する場合があります。これはRuby言語で起こると思います.プログラムの実行中にオブジェクトに新しいメソッドを定義できます. 遅延バインディングを使用すると、関数呼び出しで、既存の基本メソッドを呼び出す代わりに、メソッドの新しいオーバーライドの呼び出しを開始できます。