2

事前バインディングは、特定のデータ型のオブジェクトを宣言する概念であり、他の型のオブジェクトを保持できないことが知られています。遅延バインディングは、ジェネリック型のオブジェクトを宣言する概念であり、他の型のインスタンスを保持できます。例を考えてみましょう:

public abstract class Animal  
{ 
 public virtual string Name { get { return "Animal"; } } 
} 

public class Dog : Animal 
{ 
  public override string Name { get { return "Dog"; } } 
} 

public class Cat : Animal 
{ 
  public override string Name { get { return "Cat"; } } 
} 

public class Test  
{ 
  static void Main() 
  {
      Animal animal = new Dog(); 
      Animal animalTwo = new Cat(); 

      Console.WriteLine(animal.Name); 
      Console.WriteLine(animalTwo.Name); 
   } 
} 

私の質問は、コンパイラがいつオブジェクトの関数呼び出しを認識するのか、コンパイル時か実行時かということです。不明な場合は申し訳ありません。しかし、仮想オーバーライドと仮想メソッドの概念には遅延バインディングが含まれているかどうかを尋ねるつもりですか? ..そうでない場合、これはどのように可能ですか。

4

2 に答える 2

5

ランタイム。

仮想関数とは、ディスパッチが実行時にライブ オブジェクト参照の関数にルーティングされることを意味します。C++ では、これは vtable と呼ばれるポインターのテーブルを介して行われます。C# がどのようにそれを行うのかはわかりません。実装に依存していると思いますが、結果は同じです。

コンパイル時に、コンパイラは関数呼び出しを基本クラスの関数にバインドします。その基本クラス関数は仮想であるため、実行時に .Net は実際のオブジェクト タイプを調べて、その関数をオーバーライドするかどうかを確認します。その場合、その派生型が呼び出されます。

于 2012-06-08T08:10:36.657 に答える
0

はい、仮想メソッドには遅延バインディングが含まれます。

バインディングの詳細と遅延の原因については、次の投稿を参照してください。 -makes-it-late.aspx

于 2012-06-08T08:11:35.967 に答える