簡體   English   中英

通過接口使用類的含義

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

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