クラスの答えはわかっていると思いますが、自分の理解が正しいことを確認したいだけです。ClassA
という名前の とそのインスタンスがあるとしますa
。a.MethodA()
が呼び出されるとき:
(1) CLRClassA
の型ポインターからa
ヒープ内の型を見つける (型はヒープに読み込まれている)
(2)MethodA
型を検索し、見つからない場合は、その基本型に移動し、object
クラスまで。
私の理解は正確ではないかもしれませんが、基本的には正しいと思います (間違っていたら訂正してください!)。ここで、単純なstructの問題が発生します。
struct MyStruct
{
public void MethodA() { }
}
がありvar x = new MyStruct();
、その値はスタックにあり、の型はMyStruct
ヒープにロードされています。executex.MethodA()
の場合、もちろんボクシングはありません。CLR はどのようMethodA
に IL を見つけて取得し、それを実行/JIT しますか? 答えはおそらく次のようになると思います:(繰り返しますが、間違っていたら訂正してください)
(1) スタック上に の宣言型がx
あります。CLR は、スタック上の情報からその型を見つけMethodA
、その型を見つけます。-- と呼びましょうassumptionA
。
私assumptionA
が正しいと言っていただければ幸いです。しかし、それが間違っていても、それは真実を語っています。CLR には、ボクシングせずに構造体の型を見つける方法があります。
では、x.ToString()
またははx.GetType()
どうでしょうか。値がボックス化され、クラスのように機能することがわかっています。しかし、なぜここでボクシングが必要なのでしょうか? その型を取得できるので(仮定Aが教えてくれます)、その基本型に移動して(クラスのように)メソッドを見つけてみませんか?なぜここで高価なボックス操作が必要なのですか?