zoukankan      html  css  js  c++  java
  • .net delegate(委托类型)

    本质上,委托是指向若干方法的类型安全的对象(类似c++函数指针)。一个委托维持有三项重要的信息:1,它要调用的方法的地址 2,方法的参数(如果有的话)3,方法的返回值(如果有的话)。和c++函数指针不同的是,.net 委托可以指向静态方法和实例方法。

     

        首先来看看如何定义一个委托(使用关键字delegate

    1. // 这个委托可以指向任何接收两个int参数并返回int值的方法
    2. //二元操作
    3. public delegate int BinaryOp(int x, int y);

    你在声明这个BinaryOp委托的时候,编译器会为你生成这样的一个类:

    1. sealed class BinaryOp : System.MulticastDelegate
    2. {
    3. public BinaryOp(object target, uint functionAddress);
    4. public int Invoke(int x, int y);
    5. public IAsyncResult BeginInvoke(int x, int y,
    6. AsyncCallback cb, object state);
    7. public int EndInvoke(IAsyncResult result);
    8. }

    其中,Invoke是核心方法,顾名思义,是用来调用委托中维持的每个方法。BeginInvoke() 和EndInvoke()用来异步调用当前的方法。这个需要你有多线程编程的背景,超出了本文要描述的范围。这里你只要理解委托其实暗中实现了本来要用多线程才能实现的功能。

    待续……

    初次认识委托,可能会觉得有点困惑。现在来看看一个完整的例子:

    1. namespace SimpleDelegate
    2. {
    3. // 这个委托可以指向任何接收两个int参数并返回int值的方法
    4. //二元操作
    5. public delegate int BinaryOp(int x, int y);
    6. // 该类包含BinaryOp要指向的方法
    7. //
    8. public class SimpleMath
    9. {
    10. public static int Add(int x, int y)
    11. return x + y; }
    12. public static int Subtract(int x, int y)
    13. return x - y; }
    14. }
    15. class Program
    16. {
    17. static void Main(string[] args)
    18. {
    19. Console.WriteLine("***** Simple Delegate Example *****\n");
    20. // 创建一个指向SimpleMath.Add()的BinaryOp对象
    21. // 
    22. BinaryOp b = new BinaryOp(SimpleMath.Add);
    23. // 调用Add()方法 ,间接 使用了delegate 对象.
    24. Console.WriteLine("10 + 10 is {0}", b(10, 10));
    25. Console.ReadLine();
    26. }
    27. }
    28. }
  • 相关阅读:
    用命令创建MySQL数据库
    Linux下安装mysql
    MySQL字符集及校对规则的理解
    Mybatis 高级结果映射 ResultMap Association Collection
    查看linux系统版本命令
    hdu 1217 Arbitrage (最小生成树)
    hdu 2544 最短路(两点间最短路径)
    hdu 3371 Connect the Cities(最小生成树)
    hdu 1301 Jungle Roads (最小生成树)
    hdu 1875 畅通工程再续(prim方法求得最小生成树)
  • 原文地址:https://www.cnblogs.com/ulex/p/1672486.html
Copyright © 2011-2022 走看看