CLR如何加载接口类型?

时间:2015-08-08 08:39:22

标签: c# .net interface clr method-dispatch

如果未使用Concrete实现初始化CLR Load接口类型吗?

考虑具有实现FooImpl

的接口IFoo

e.g。

IFoo foo;

而不是

IFoo foo = new FooImpl();

CLR只会在第二种情况下加载IFoo类型吗?另外,如果有另一种类型继承自FooImpl(例如FooImpl2)

此代码是否会从FooImpl2开始并继续继承层次结构以加载IFoo接口?此外,IFoo的MethodTable是否包含一个直接指向FooImpl2方法表的指针,或者它是否会通过中间实现类型(即FooImpl)重定向。

IFoo foo = new FooImpl2();

1 个答案:

答案 0 :(得分:2)

这行代码

IFoo foo;

表示foo是一个变量,可以保存对实现接口IFoo的对象的引用。

  

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

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

这行代码:

IFoo foo = new FooImpl();

表示foo将保存对实现IFoo接口的对象的引用,只是这个。

  

此外,如果有另一种类型继承自FooImpl(例如   FooImpl2)这段代码将从FooImpl2开始并向上走   继承层次结构加载IFoo接口?

没有

  

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

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