通过接口使用类的含义

时间:2013-02-15 11:48:43

标签: c# class interface

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

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

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

1 个答案:

答案 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,他们就像虚拟方法一样在调度表中获得一个插槽。

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