[英]How are interface types loaded by the CLR?
如果未使用具體實現初始化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
接口的對象的引用,僅此IFoo
。
另外,如果還有另一個從FooImpl繼承的類型(例如FooImpl2),此代碼是否將從FooImpl2開始並向上繼承層次結構以加載IFoo接口?
沒有
另外,IFoo的MethodTable將直接包含指向FooImpl2的方法表的指針,還是通過中間實現類型(即FooImpl)重定向。
將存儲在變量中的引用將指向FooImpl2的方法表直接。 實際上,它將指向存儲在堆中的具體對象,並且將引用FooImpl2
的方法表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.