A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 全海波 中级黑马   /  2012-7-27 18:22  /  1259 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我搞不清委托问题,谁能给我举个例子,详细讲解一下委托的概念及应用,本人不胜感激!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

2 个回复

倒序浏览
/*委托
委托是一种可以把引用存储为函数的类型,只有在介绍到事件和事件处理的时候才解释的清楚.委托的声明非常类型函数,但是不带函数体,而且要使用delegate,委托的声明指定了一个函数签名,其中包含一个返回类型和参数列表.定义了委托后就可以声明该委托类型的变量,接着把这个变量初始化为与委托有相同。

Delegate关键字指定该定义是用于委托的,而不是用于函数的, 委托和事件这两个概念是完全配合的。委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个引用函数,将其作为它构造函数的参数.*/

namespace 委托
{
    class MyDelegate
    {
        //double型的二元参数委托
        //委托的声明非常类型函数,但是不带函数体,而且要使用delegate,委托的声明指定了一个函数签名;Delegate关键字指定该定义是用于委托的,而不是用于函数的
        //委托仅仅是函数指针,它能够引用函数,通过传递地址的机制完成。委托是一个类,当你对它实例化时,要提供一个引用函数,将其作为它构造函数的参数
        delegate double ProcessDelegate(double param1, double param2);//定义一个委托
        static double Mult(double param1, double param2)
        {
            return param1 * param2;
        }
        static double Divide(double param1, double param2)
        {
            return param1 / param2;
        }

        static void Main(string[] args)
        {
            ProcessDelegate process;//定义委托成员变量
            double param1 = 16, param2 = 4;

            process = new ProcessDelegate(Mult);//实例化乘法委托
            Console.WriteLine("ProcessDelegate(Mult);{0}", process(param1, param2));
            process = new ProcessDelegate(Divide);//实例化除法委托
            Console.WriteLine("ProcessDelegate(Divide);{0}", process(param1, param2));
            Console.ReadKey();
        }
    }
}

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
本帖最后由 马林康 于 2012-7-27 18:39 编辑

1.什么是委托,为什么要使用委托

        我正在埋头苦写程序,突然想喝水,但是又不想自己去掉杯水而打断自己的思路,于是我就想让女朋友去给我倒水。她去给我倒水,首先我得让她知道我想让她干什么,通知她之后我可以继续写自己的程序,而倒水的工作就交给了她。这样的过程就相当于一个委托。

        在程序过程中,当程序正在处理某个事件的时候,我需要另外的程序代码去辅助处理一些事情,于是委托另一个程序模块去处理,而委托就可以达到这种目的,我可以利用委托通知另外的程序模块,该去调用哪个函数方法。委托其实就起到了这样一个作用,将函数签名传递到了另一个函数中。
2.委托的定义
        delegate int Add(int num1,int num2);
        delegate void ConvertNum(string result);
        上面是定义两个委托的例子,其实很简单。声明一个委托使用delegate关键字,上面分别是定义的带返回值的委托和不带返回值的委托,
两个委托都有传递参数,当然也可以不传递参数。其实委托也是一个类,委托派生为System.MulticastDelegate,而System.MulticastDelegate
又继承System.Delegate,如果你知道这个也就明白委托其实是一个特殊的类。
  1. 委托的简单实用例子


  2. Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 public delegate string TeaDelegate(string spText);

  3. public class DelegateSource
  4. {
  5. public void TestDelegate()
  6. {
  7. Operator op = new Operator();
  8. TeaDelegate tea = new TeaDelegate(op.GetTea);
  9. Console.WriteLine("去给我倒杯水");
  10. Console.WriteLine();
  11. string result=tea("去给我倒杯水");
  12. Thread.Sleep(5000);
  13. Console.WriteLine(result);
  14. Console.WriteLine();
  15. }
  16. }

  17. public class Operator
  18. {
  19. /// <summary>
  20. /// 确定是否还有水
  21. /// </summary>
  22. private bool flag = true;

  23. public string GetTea(string spText)
  24. {
  25. if (spText == "去给我倒杯水")
  26. {
  27. if (flag)
  28. {
  29. return "老公,茶来了";
  30. }
  31. else
  32. {
  33. return "老公,没有水了";
  34. }
  35. }
  36. return "等待.......";
  37. }
  38. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马