WEB开发网
开发学院软件开发C语言 委托揭秘 阅读

委托揭秘

 2009-06-10 08:32:08 来源:WEB开发网   
核心提示: 注意,所有委托都有一个构造器,委托揭秘(4),该函数取2个参数:一个是对象引用,另一个是引用回调方法的一个整数,因为编译器知道aMyDelegate 是一个引用了一个委托对象的变量,所以会生成代码调用该委托对象的Invoke方法,然而,如果仔细查看代码1-1的源代码

注意,所有委托都有一个构造器,该函数取2个参数:一个是对象引用,另一个是引用回调方法的一个整数。然而,如果仔细查看代码1-1的源代码,会发现传递的是 TestMethod。根据我们所学的编程知识判断,这段代码不会通过编译!

 然而,C#编译器知道正在构建的是委托,所以会解析源代码以确定引用的是哪个对象和方法。对象引用被传递给构造器的aobject参数,一个特殊的标识方法的 IntPtr值(从MethodDef 或 MemberRef 元数据标记获得)被传递给method 参数。对于静态方法,null 被传递给 object 参数。在构造器内部,这两个参数分别保存在 _target 和 _methodPtr 私有字段内。

 除此之外,构造器还将 _invocationList 字段设置为 null。 

 如此看来,每个委托对象实际封装了一个方法和调用该方法时要操作的一个对象。

 知道了委托对象如何构造,并了解了其内部结构之后,我们要谈谈回调方法是如何调用的。 为了方便起见,下面重复了代码1-1中的 Method(MyDelegate aMyDelegate)方法的代码:

private void Method(MyDelegate aMyDelegate)
{
    if (aMyDelegate != null)
    {
        aMyDelegate();
    }
}

 if 语句首先检查 aMyDelegate 是否为 null。如果 aMyDelegate 不为 null,你会看到下一行代码调用了回调方法。null 检查必不可少,因为 aMyDelegate 实际上只是一个可能引用 MyDelegate 委托对象的变量,它也可能为 null。这段代码看上去就像是调用了一个名为 aMyDelegate 的函数。但是,这里没有名为 aMyDelegate 的函数。再次重申,因为编译器知道 aMyDelegate 是一个引用了一个委托对象的变量,所以会生成代码调用该委托对象的Invoke方法。换而言之,编译器看到以下代码时:

上一页  1 2 3 4 5  下一页

Tags:委托 揭秘

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接