1

如果没有使用具体实现进行初始化,CLR 是否会加载接口类型?

考虑具有实现 FooImpl 的接口 IFoo

例如

IFoo foo;

IFoo foo = new FooImpl();

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

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

IFoo foo = new FooImpl2();
4

1 回答 1

2

这行代码

IFoo foo;

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

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

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

这行代码:

IFoo foo = new FooImpl();

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

此外,如果存在从 FooImpl 继承的另一种类型(例如 FooImpl2),此代码是否会从 FooImpl2 开始并沿着继承层次结构来加载 IFoo 接口?

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

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

于 2015-08-08T08:48:09.603 回答