2

通过接口使用类而不是直接使用类有什么含义?

例如,当通过IList<Int32>接口而不是List<Int32>直接使用类来改变整数列表时。这是否会引入装箱转换、更多类型检查、空值检查、更多间接级别、虚拟调用、减少优化、防止方法内联?如果是这样,我怎样才能减轻其中的一些?

我正在编写一个库,我打算在其中所有集合类都通过它们的接口使用。该库适用于可能希望在高性能环境中使用它的其他开发人员。

4

1 回答 1

1

拳击

classAFAIK,如果实现类型是引用(即)类型,则接口不会引入任何额外的装箱。如果实现类型本身是值类型(即 a struct),那么当分配给接口类型的变量时,该值类型将被装箱:

struct Foo : IFooBar { … }           class Bar : IFooBar { … }
IFooBar foo = new Foo();             IFooBar bar = new Bar();
//          ^                                    ^
//       boxing                              no boxing

这是因为接口类型被视为引用类型。请记住,您可以分配nullIFooBar-typed 变量,但不能分配给Foo-typed 变量!

旁注:如果实现类型是 a struct,也许也可以看到这个问题

虚拟调度

但是,实现接口方法的方法在内部的处理方式与虚拟方法类似;即,即使您没有声明实现方法,它们也会像虚拟方法一样在调度表中获得一个槽virtual

不要太担心这个。虚拟方法分派不应该被视为面向对象语言中的问题——这很正常。您不太可能看到由它引起的任何性能问题。

于 2013-02-15T11:57:09.427 回答