CLR 如何加载接口类型?
How are interface types loaded by the CLR?
如果 CLR 加载接口类型未使用具体实现进行初始化,它们是否是类型?
考虑一个具有实现 FooImpl 的接口 IFoo
例如
IFoo foo;
相对于
IFoo foo = new FooImpl();
第二种情况CLR会不会只加载IFoo类型?此外,如果有另一种类型继承自 FooImpl(例如 FooImpl2)
这段代码会不会从FooImpl2开始,沿着继承层次往上走,加载IFoo接口?此外,IFoo 的 MethodTable 是否包含直接指向 FooImpl2 的方法的指针 table 还是会通过中间实现类型(即 FooImpl)重定向。
IFoo foo = new FooImpl2();
这行代码
IFoo foo;
表示 foo
是一个变量,可以保存对实现接口 IFoo
的对象的引用。
Will the CLR only load the IFoo Type in the second case?
在第二种情况下,您创建了一个 FooImpl
类型的对象,并使用了一个名为 foo
的变量来存储对该对象的引用。为了让变量保存对对象的引用,变量的类型应该符合该对象。说兼容,我的意思是变量的类型与您创建的对象相同,或者是基类型或接口。也就是说没有任何接口的任何负载。
这行代码:
IFoo foo = new FooImpl();
说 foo
将保存对实现 IFoo
接口的对象的引用,就是这个。
Also if there is a another type which inherits from FooImpl (e.g.
FooImpl2) Will this code start from FooImpl2 and walk up the
inheritance hierarchy to load IFoo interface?
没有
Also, will the IFoo's MethodTable contain a pointer directly to the
FooImpl2's method table or will it redirected via the intermediate
implementing type (ie FooImpl).
将存储在变量中的引用将直接指向 FooImpl2 的方法 table。实际上,它会指向存储在堆中的具体对象,并且会引用 FooImpl2
.
的方法 table
如果 CLR 加载接口类型未使用具体实现进行初始化,它们是否是类型?
考虑一个具有实现 FooImpl 的接口 IFoo
例如
IFoo foo;
相对于
IFoo foo = new FooImpl();
第二种情况CLR会不会只加载IFoo类型?此外,如果有另一种类型继承自 FooImpl(例如 FooImpl2)
这段代码会不会从FooImpl2开始,沿着继承层次往上走,加载IFoo接口?此外,IFoo 的 MethodTable 是否包含直接指向 FooImpl2 的方法的指针 table 还是会通过中间实现类型(即 FooImpl)重定向。
IFoo foo = new FooImpl2();
这行代码
IFoo foo;
表示 foo
是一个变量,可以保存对实现接口 IFoo
的对象的引用。
Will the CLR only load the IFoo Type in the second case?
在第二种情况下,您创建了一个 FooImpl
类型的对象,并使用了一个名为 foo
的变量来存储对该对象的引用。为了让变量保存对对象的引用,变量的类型应该符合该对象。说兼容,我的意思是变量的类型与您创建的对象相同,或者是基类型或接口。也就是说没有任何接口的任何负载。
这行代码:
IFoo foo = new FooImpl();
说 foo
将保存对实现 IFoo
接口的对象的引用,就是这个。
Also if there is a another type which inherits from FooImpl (e.g. FooImpl2) Will this code start from FooImpl2 and walk up the inheritance hierarchy to load IFoo interface?
没有
Also, will the IFoo's MethodTable contain a pointer directly to the FooImpl2's method table or will it redirected via the intermediate implementing type (ie FooImpl).
将存储在变量中的引用将直接指向 FooImpl2 的方法 table。实际上,它会指向存储在堆中的具体对象,并且会引用 FooImpl2
.