如果未使用具体实现初始化CLR加载接口类型,是否可以?
考虑具有实现FooImpl的接口IFoo
例如
IFoo foo;
相对于
IFoo foo = new FooImpl();
在第二种情况下,CLR是否只会加载IFoo类型?另外,如果还有另一个从FooImpl继承的类型(例如FooImpl2)
这段代码是否将从FooImpl2开始并沿继承层次结构加载IFoo接口?另外,IFoo的MethodTable将直接包含指向FooImpl2的方法表的指针,还是通过中间实现类型(即FooImpl)重定向。
IFoo foo = new FooImpl2();
这行代码
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] 删除。
我来说两句