详细探讨delegate(委托)和event(事件)(1)

delegate(1)

 

C++、Pascal 和其他语言支持函数指针的概念,允许您在运行时选择要调用哪些函数。

Java 不提供任何具有函数指针功能的结构,但 C# 提供这种构造。通过使用 Delegate 类,委托实例可以封装属于可调用实体的方法。对于实例方法,委托由一个包含类的实例和该实例上的方法组成。对于静态方法,可调用实体由一个类和该类上的静态方法组成。因此,委托可用于调用任何对象的函数,而且委托是面向对象的、类型安全和安全的。

定义和使用委托有三个步骤:声明, 实例化,调用。

delegate void Del1();

然后可以使用此委托引用返回 void 而且不带任何参数的函数。

类似地,若要为任何带字符串参数且返回 long 型结果的函数创建委托,则使用以下语法:

delegate long Del2(string s);

然后,可以将此委托分配到带有此签名的任何方法,如下所示:

Del2 d;
d = DoWork;

其中 DoWork 的签名为:

public static long DoWork(string name)

Delegate 对象是不可变的,即设置与它们匹配的签名后就不能再更改签名了。但是,如果其他方法具有同一签名,您也可以指向该方法。在本例中,将 d 重新分配给一个新的委托对象,因此 d 将调用 DoMoreWork 方法。只有 DoWorkDoMoreWork 具有相同签名时,您才可以执行此操作。

Del operation;                 // 声明委托变量
operation = Add;      // 将委托指向某个方法
long sum = operation(11, 22);  // 调用委托

 

以下代码演示了委托的创建、实例化和调用:

public class MathClass
{
    public static long Add(int i, int j)       // static
    {
        return (i + j);
    }

    public static long Multiply (int i, int j)  // static
    {
        return (i * j);
    }
}

class TestMathClass
{
    delegate long Operation(int i, int j);  

    static void Main()
    {
        Operation opr;          
        opr = MathClass.Add;       // 指向一个静态方法
      long sum = operation(11, 22);             // 通过委托调用该方法

     opr = MathClass.Multiply;  
        long product = operation(30, 40);        
        System.Console.WriteLine("11 + 22 = " + sum);
        System.Console.WriteLine("30 * 40 = " + product);
    }
}

 

上面这些例子都是来自MSDN,相信很多人和我一样有个疑问:编译器是怎么实现的委托?下一篇(http://canbeatle.iteye.com/blog/686201)我将使用ILDASM工具来查看 delegate 的实现方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值