C#.NET隐式和显式接口方法实现幕后发生的故事

栏目: ASP.NET · 发布时间: 6年前

内容简介:C#.NET隐式和显式接口方法实现幕后发生的故事

在C#中,一个类型加载到CLR中,会为该类型创建并初始化一个方法表(读者可自行搜索 CLR的执行模型)。在这个方法表中,类型引入的每个新方法都有一条对应的纪录项。以及该类型继承的所有虚方法添加了记录项。继承的虚方法既有父类定义的方法,也有接口定义。例如:

interface IParent
    {
        void Test();
    }
    class Children : IParent
    {
        public void Test()
        {
            Console.WriteLine("Children Method");
        }
    }

那么方法表中将包含与以下方法对应的纪录项:

Object(隐式继承的基类)定义的所有虚实例方法。

IParent(继承接口的方法Test)

Children中的新方法Test

为了简化编程,C# 编译器假定Children 引入的Test 方法是对IParent的Test的方法的实现。C#编译器之所以这样做出假定,是因为Test方法的可访问性是public,而且接口方法的签名和新引入的方法完全一致。也就是说两个方法具有相同的参数和返回类型。如果新的Test方法被标记为virtual,C#编译器仍会认为该方法匹配与接口方法。

C#编译器将一个新的方法和一个接口方法匹配起来之后,会生成元数据,指明Children类型方法表中的两个纪录项应引用同一个实现。为了更清楚的理解这一点,下面用代码演示调用Test方法:

public static void Main()
        {
            Children children = new Children();
            children.Test();
            IParent par = children;
            par.Test();
        }

在第一个Test方法调用中,Children定义的Test方法被调用。 然后定义一个IParent接口类型的变量par,对应的引用为Children对象。然后再调用Test方法时,是调用的IParent接口的Test方法。由于C#要求公共的Test方法还必须是IParent的Test方法的实现,所以会执行相同的代码,输出相同的结果。

输出的结果都为:

Children Method
Children Method

现在修改一下接口方法的实现:再来看一下结果

interface IParent
    {
        void Test();
    }
    class Children : IParent
    {
        public void Test()
        {
            Console.WriteLine("Children Method");
        }
         void IParent.Test()
        {
            Console.WriteLine("IParent Method");
        }
    }
        public static void Main()
        {
            Children children = new Children();
            children.Test();
            IParent par = children;
            par.Test();
        }

输出的结果为:

Children Method
IParent Method

在C#中将定义方法的那个接口的名称作为方法名的前缀,例如上面的IParent.Test,创建的就是一个显式接口方法实现(Explicit Interface Method Implementation ,EIMI)。注意, 在C#中定义一个显式接口方法时,不允许指定可访问性(public或者private等)。 否则编译器汇报错误,例如下图 C#.NET隐式和显式接口方法实现幕后发生的故事

但是编译器生成方法的元数据时,其可访问性会被自动设为private,防止其它代码在使用类的实例时直接调用接口方法。要调用接口方法,只能通过接口类型的一个变量来进行。还要注意,一个EIMI方法不能标记为virtual,所以它不能被重写。这是因为EIMI方法并非真的是类型对象模型的一部分,它是将一个接口(一组行为或者方法)连接到一个类型上,同时避免公开行为/方法的一种方式。这也同样解释了把鼠标放在接口上时为什么会有两种方法的实现。

C#.NET隐式和显式接口方法实现幕后发生的故事

参考来源:CLR VIA C# 第三版 第13章 13.5节。


以上所述就是小编给大家介绍的《C#.NET隐式和显式接口方法实现幕后发生的故事》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

CSS商业网站布局之道

CSS商业网站布局之道

朱印宏 / 清华大学出版社 / 2007-1 / 75.00元

本书是一本CSS技术专著。 主要从布局角度全面、系统和深入地讲解CSS在标准网站布局之中的应用。很多读者经过初步的学习之后就能够使用CSS设计出一些漂亮的网页样式,于是便乐在其中,踌躇满志,这是好事,但千万不要自我陶醉,因为你还未领略CSS的博大精深。用CSS容易,难的是全部都用CSS。CSS的精髓是布局,而不是样式,布局是需要缜密的逻辑思维和系统设计的,而样式只需要简单地编写代码或复制即可。本书......一起来看看 《CSS商业网站布局之道》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具