通过接口使用类而不是直接使用类有什么含义?
例如,通过IList<Int32>
接口改变整数列表而不是直接使用List<Int32>
类。这是否会引入装箱转换,更多类型检查,空检查,更多级别的间接,虚拟调用,减少优化,防止方法内联?如果是这样,我该如何减轻其中一些?
我正在编写一个库,我希望通过它们的接口使用所有集合类。该库适用于可能希望在高性能设置中使用它的其他开发人员。
答案 0 :(得分:1)
AFAIK,如果实现类型是引用(即class
)类型,则接口不会引入任何额外的装箱。如果实现类型本身是值类型(即struct
),那么当分配给接口类型的变量时,该值类型将被加框:
struct Foo : IFooBar { … } class Bar : IFooBar { … }
IFooBar foo = new Foo(); IFooBar bar = new Bar();
// ^ ^
// boxing no boxing
这是因为接口类型被视为引用类型;请记住,可以将null
分配给IFooBar
类型的变量,但不能分配给Foo
类型的变量!
旁注:如果实施类型为
struct
,也可以参见this question。
但是,实现接口方法的方法在内部处理与虚方法类似;即使你没有声明实现方法virtual
,他们就像虚拟方法一样在调度表中获得一个插槽。
不要太担心这个。虚拟方法调度不应该被视为面向对象语言中的问题 - 这是正常的。您不太可能看到由此引起的任何性能问题。