5

タイトルが説明的かどうかはわかりますが、概念を理解するための助けが必要です.

Type オブジェクトに関連付けられたメソッド テーブルを持つクラス (参照型) があります。メソッド テーブルに加えて、型オブジェクトには、すべての静的フィールド、型 obj ポインター、および同期ブロック インデックスも含まれます。

CLR は、参照型のインスタンスでメソッドを呼び出すときに、このメソッド テーブルを参照します。

メソッド テーブルには、インスタンス フィールドの状態を変更するために使用される特定のメソッドの IL が含まれています。

同様に、構造体 (値の型) のメソッドを定義できます。

実行時に値型でメソッドが呼び出されると、CLR は値型のインスタンスで呼び出されるメソッドの IL をどこから参照しますか。

struct A
{
    // for Immutability of value type
    public readonly int a;

    public void MethodOnValueType()
    {
        // Some code here
    }
}

「MethodOnValueType」という名前のメソッドの IL を見つけるために、CLR はどこを参照しますか?

マネージ ヒープに値型の型オブジェクトはありますか?

参照型の場合は確かですが、値型については混乱しています。

ありがとう。

4

2 に答える 2

1

Typeクラスと同じように、値型にはオブジェクトがあります。

Type intType1 = typeof(int);
Type intType2 = 100.GetType();

Debug.Assert(ReferenceEquals(intType1, intType2));

非仮想メソッドへのディスパッチは、構造体の場合もクラスの場合も基本的に同じです。

仮想メソッドには、参照型のプロパティであるvテーブルでのルックアップが含まれます。インターフェイスを定義する構造体を宣言し、そのインターフェイスを介して呼び出すと、この仮想メンバーを呼び出すことができるように、参照型に自動的にボックス化されます。

それがいくらか役立つことを願っています。

于 2012-12-23T16:46:28.593 に答える
1

値型のメソッドはポリモーフィズムをサポートしません (オブジェクトから継承されたメソッドは例外で、オーバーライドされているかどうかによって異なる方法で実行されます)。呼び出しは静的呼び出しです (仮想呼び出しではありません)。基本的に、呼び出し情報の「どのメソッド」の部分がコンパイラによって解決され、IL に焼き付けられます。その呼び出しを最終的なメソッド コードに接続するのは、JIT の仕事です。

値型にはオブジェクトヘッダーなどはありません。

値型の Type オブジェクトを取得できますが、これはメソッド呼び出しとは関係ありません。

于 2012-12-23T16:59:53.780 に答える