我想我已经知道了一堂课的答案,只是想确认我的理解是正确的。假设我有一个ClassA
名为a
. 何时a.MethodA()
调用:
(1)CLRClassA
通过堆中的类型指针a
查找类型(类型已加载到堆中)
(2)MethodA
在类型中查找,如果没有找到,就去它的基类型,直到object
类。
也许我的理解不是很准确,但我认为它基本上是正确的(如果错了,请纠正我!)。这里出现了一个简单结构的问题。
struct MyStruct
{
public void MethodA() { }
}
我有var x = new MyStruct();
,它的值在堆栈上,并且类型MyStruct
已经加载到堆中。执行x.MethodA()
时,当然没有装箱。CLR 如何找到MethodA
并获取 IL 并执行/JIT 它?我认为答案可能是:(再次,如果我错了,请纠正我)
(1) 我们有栈上的声明类型。x
CLR 通过堆栈上的信息找到它的类型,并MethodA
在它的类型中查找。- 让我们称之为assumptionA
。
如果你告诉我我assumptionA
是对的,我会很高兴。但即使它是错误的,它也说明了一个事实:CLR 有一种方法可以在不装箱的情况下找到结构的类型。
现在x.ToString()
orx.GetType()
呢?我们知道该值将被装箱,然后它将像一个类一样执行。但是为什么我们在这里需要拳击呢?既然我们可以得到它的类型(假设 A 告诉我们),为什么不去它的基类型并找到方法(就像一个类一样)?为什么这里需要一个昂贵的盒子操作?