CLR如何加载接口类型?

加纳什兰

如果未使用具体实现初始化CLR加载接口类型,是否可以?

考虑具有实现FooImpl的接口IFoo

例如

IFoo foo;

相对于

IFoo foo = new FooImpl();

在第二种情况下,CLR是否只会加载IFoo类型?另外,如果还有另一个从FooImpl继承的类型(例如FooImpl2)

这段代码是否将从FooImpl2开始并沿继承层次结构加载IFoo接口?另外,IFoo的MethodTable将直接包含指向FooImpl2的方法表的指针,还是通过中间实现类型(即FooImpl)重定向。

IFoo foo = new FooImpl2();
克里斯托斯(Christos)

这行代码

IFoo foo;

说的foo是一个变量,可以保留对实现接口的对象的引用IFoo

在第二种情况下,CLR是否只会加载IFoo类型?

在第二种情况下,您将创建一个类型的对象,FooImpl并使用一个名为的变量foo来存储对该对象的引用。为了使变量能够保存对对象的引用,变量的类型应与此对象兼容。说合规,我的意思是变量的类型将与您创建的对象相同,或者是基本类型或接口。话虽如此,没有任何接口的负担。

这行代码:

IFoo foo = new FooImpl();

表示,foo它将保存对实现该IFoo接口的对象的引用,仅此而已。

另外,如果还有另一个从FooImpl继承的类型(例如FooImpl2),此代码是否将从FooImpl2开始并向上继承层次结构以加载IFoo接口?

此外,IFoo的MethodTable将直接包含指向FooImpl2的方法表的指针,还是通过中间实现类型(即FooImpl)重定向。

将存储在变量中的引用将指向FooImpl2的方法表直接。实际上,它将指向存储在堆中的具体对象,并且将引用方法表FooImpl2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章