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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄山 黑马帝   /  2011-12-25 12:13  /  1867 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

委托是个类还是个方法呀? 还有人说委托像C/C++的函数指针,有什么区别呢?

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

2 个回复

倒序浏览
经睿 黑马帝 2011-12-28 09:55:50
沙发
一、委托(delegate)

(一)是什么

1.委托也是一个类,简单的说是面向对象的函数指针。

2.委托是函数的封装,代表一“类”函数。这些函数符合一定的签名,即拥有相同的参数列表和返回值类型。

3.委托也可以看成是对函数的抽象,是函数的类。如同把任何人走路这种方法抽象为一个委托,走路的委托代表任何人走路

4.委托声明定义了一个引用类型,它用一组特定的参数以及返回类型来封装方法。

public delegate void Del(string Message);//这个委托封装了所有只有一个string类型参数且返回类型为void的方法

(二)能做什么

对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。如果你有一个委托对象和一组适当的参数,则可以用这些参数调用该委托

(三)怎么做

1.首先声明一个委托(在声明类的同一级声明委托),该委托的返回类型和所搭载的方法的返回类型相同,并且传入的参数类型与方法传入的参数类型相同

delegate void EatDelegate(string food);

2.声明一个委托的实例,并完成初始化,传入所搭载的方法名

EatDelegate zs = new EatDelegate(zsEat);

3.调用该委托,并传入该委托所代理的方法的参数,完成委托的调用

zs("西瓜");

4.完整代码

    delegate void EatDelegate(string food);
    class Program
    {
        static void Main(string[] args)
        {
            EatDelegate zs = new EatDelegate(zsEat);
            zs("西瓜");
            Console.ReadKey();
        }
        static void zsEat(string food)
        {
            Console.WriteLine("张三吃{0}", food);
        }
    }
(四)什么时候用

1.灵活的方法调用

2.用于异步回调

3.多线程编程中使用委托来指定启动一个线程时调用的方法

4.C#中的事件模型,用委托指明处理给定事件的方法

(五)特点

1.一个委托delegate可以搭载多个方法

2.一个委托所搭载的方法并不需要属于同一个类,但一个委托所搭载的所有方法必须具有相同的返回类型和参数列表

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

回复 使用道具 举报
本帖最后由 傅涌钦 于 2011-12-28 18:45 编辑

要谈委托,就要先从事件说:应用程序有基于过程和基于事件的,后者可以同时做多个事件;然而什么是事件呢,首先基于windows应用程序,有菜单按钮等不同选项,这些称为事件驱动,当用户请求这些东西时,就产生了事件,而处理事件的代码就称为事件处理程序;在创建事件时第一步就是要定义事件处理程序的签名,这个签名就称为委托,它是产生事件的类的一部分;如:public delegate A( int x ,bool b);__定义处理程序的委托只是创建和处理我们自己的事件的一个步骤.

评分

参与人数 1技术分 +2 收起 理由
李荣壮 + 2

查看全部评分

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