[英]Implications of using a class through an interface
通過接口使用類而不是直接使用類有什么含義?
例如,當通過IList<Int32>
接口修改整數列表時,與直接使用List<Int32>
類相反。 這會導致裝箱轉換,更多類型檢查,空檢查,更多級別的間接調用,虛擬調用,減少的優化,防止方法內聯嗎? 如果是這樣,我該如何緩解其中的一些情況?
我正在編寫一個庫,打算在其中通過所有接口使用所有集合類。 該庫適用於可能希望在高性能設置中使用它的其他開發人員。
AFAIK,如果實現類型是引用(即class
)類型,則接口不會引入任何其他框。 如果實現類型本身是一個值類型(即struct
),則將該值類型分配給接口類型的變量時將被裝箱:
struct Foo : IFooBar { … } class Bar : IFooBar { … }
IFooBar foo = new Foo(); IFooBar bar = new Bar();
// ^ ^
// boxing no boxing
這是因為接口類型被視為引用類型。 請記住,您可以為IFooBar
類型的變量分配null
,但不能為Foo
類型的變量分配null
!
旁注:如果實現類型為
struct
,也許也可以看到此問題 。
但是,實現接口方法的方法在內部與虛擬方法相似; 也就是說,即使您尚未將實現方法聲明為virtual
,它們也會像虛擬方法一樣在調度表中獲得一個插槽。
不用為此擔心太多。 在面向對象的語言中,不應將虛擬方法分派視為問題,這只是正常現象。 您不太可能看到由它引起的任何性能問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.