簡體   English   中英

CLR如何加載接口類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM