C# CLR如何加载接口类型?

C# CLR如何加载接口类型?,c#,.net,interface,clr,method-dispatch,C#,.net,Interface,Clr,Method Dispatch,如果没有用具体实现初始化接口类型,CLR是否加载接口类型 考虑一个接口IFoo,它有一个实现FooImpl e、 g 相对于 IFoo foo = new FooImpl(); 在第二种情况下,CLR是否只加载IFoo类型?另外,如果存在从FooImpl继承的其他类型(例如FooImpl2) 这段代码是否从FooImpl2开始,并沿着继承层次结构向上遍历以加载IFoo接口?此外,IFoo的MethodTable是否包含直接指向FooImpl2方法表的指针,或者是否通过中间实现类型(ie Foo

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

考虑一个接口IFoo,它有一个实现FooImpl

e、 g

相对于

IFoo foo = new FooImpl();
在第二种情况下,CLR是否只加载IFoo类型?另外,如果存在从FooImpl继承的其他类型(例如FooImpl2)

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

这行代码

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

表。感谢您的回答,在IFoo foo=newfooimpl2的情况下,CLR是否会看到IFoo类型,然后使用SlotMap将调用重定向到实际实现。或者CLR看到的是FooImpl2的对象而不是接口?@ganeshran不客气!我很高兴我帮了忙:)。CLR确实看到引用赋值。可以分配给左操作数的变量应实现
IFoo
类型。就这个。顺便说一句,关于这个主题最详细的书是杰弗里的《里希特》,通过C#的CLR。没有什么非常微妙的事情发生,CLR中的存根是99%在水下的冰山。万斯·莫里森在文章中解释得很好。@HansPassant谢谢你分享这篇文章,我会看的!我记得你曾在2009年主持过MSDN论坛。。
IFoo foo;
IFoo foo = new FooImpl();