C#中的接口
本文中所有图示纯为个人理解(参考了Assembly中元数据的存储方式),与真实情况可能有所出入。 图中绿色表示公有方法,红色表示私有方法。
本文将通过以下四个案例来分析C#中的接口究竟是如何工作的。
1、公有方法实现接口方法
尽管C#在定义接口时不用指明接口方法的访问控制方式,但默认接口方法均为public型(这可以从反编译的IL代码中看到)。下面是使用Reflector查看的接口IL代码
.class private interface abstract auto ansi IControl { .method public hidebysig newslot abstract virtual instance void Paint() cil managed { } }
实现接口的类需要实现所有接口方法。通常情况下,接口的实现方法也为public型。如下案例:
using System ; interface IControl { void Paint(); } public class EditBox: IControl { public void Paint() { Console.WriteLine("Pain method is called!"); } } class Test { static void Main() { EditBox editbox = new EditBox(); editbox.Paint(); ((IControl)editbox).Paint(); } }
程序的执行结果为:
Pain method is called! Pain method is called!
接口就好像是关系型数据库中的一对多表,一个接口对应多个接口方法,每个接口方法又对应虚拟方法表(VMT)中的某个公有或私有方法。上面代码在内存中的镜像可由下图描述:
从图中我们可以看到直接对Paint方法的调用以及通过接口对Paint方法的调用。可见通过接口对方法进行调用需要多出一道转换工作,因此执行效率不如直接调用。