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