我想我已经知道了一堂课的答案,只是想确认我的理解是正确的。假设我有一个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) 我们有栈上的声明类型。xCLR 通过堆栈上的信息找到它的类型,并MethodA在它的类型中查找。- 让我们称之为assumptionA。
如果你告诉我我assumptionA是对的,我会很高兴。但即使它是错误的,它也说明了一个事实:CLR 有一种方法可以在不装箱的情况下找到结构的类型。
现在x.ToString()orx.GetType()呢?我们知道该值将被装箱,然后它将像一个类一样执行。但是为什么我们在这里需要拳击呢?既然我们可以得到它的类型(假设 A 告诉我们),为什么不去它的基类型并找到方法(就像一个类一样)?为什么这里需要一个昂贵的盒子操作?