4

私が知っているように、各変数はその実行時の型を知っています。

次に例を示します。

void Main()
{
    C c = new C();
    c.M();
    I i = (I)c;
    i.M();
}

public interface I
{
    void M();
}

public class C : I
{
    void I.M() 
    {
        Console.WriteLine("I.M");
    }

    public void M() 
    {
        Console.WriteLine("M");
    }
}

私がそれを正しく理解していればi、そのタイプが であることはまだわかっていCます。では、代わりにi使用することを決定できるメカニズムは何ですか?I.MM

4

2 に答える 2

8

内部的には、各オブジェクトには独自のTypeHandleがあります。以下のオブジェクトの内部構造を参照してください。

MSDN-.NET Frameworkの内部にドリルインして、CLRがランタイムオブジェクトを作成する方法を確認する

ここに画像の説明を入力してください

于 2013-03-12T14:36:51.950 に答える
4

ランタイムメソッドバインディングがどのように機能するか、つまり、コンパイル時にどのメソッドを呼び出すかをプログラムに正確にエンコードするのに十分な情報がなかった場合に、ランタイムが別のメソッドMではなく1つのメソッドMを呼び出すことをどのように知るのかを知りたいですか?

これが良い練習です:ランタイムですでに書かれているので、機能を使わずにその振る舞いをするプログラムを書いてみてください。そうすることで、ランタイムを実装している人々がどのようにそれを行ったかについての洞察を得ることができます。

ここでは、仮想関数についてこの演習を行います。

http://blogs.msdn.com/b/ericlippert/archive/2011/03/17/implementing-the-virtual-method-pattern-in-c-part-one.aspx

そのシリーズを読むと、仮想ディスパッチがない言語で仮想ディスパッチをエミュレートする方法がわかります。私が記事で示している基本的な考え方は、C#で仮想ディスパッチが実際にどのように機能するかということです。インターフェイスのディスパッチは実際には少し注意が必要ですが、概念は基本的に同じです。

于 2013-03-12T14:48:26.777 に答える