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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何学强 中级黑马   /  2012-9-27 17:16  /  1826 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

事件是不是一种委托

评分

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

查看全部评分

4 个回复

倒序浏览
委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。
举例:
//声明一个委托,这里的NewDelegate()可以理解为是之后用来取方法的一个类型。
delegate void  NewDelegate();
//下面定义的a,b两种方法,可以理解为NewDelegate这个类型的两个实例。
public void a(){};
public void b(){};
public void main()
{
       NewDelegate dgt1=new NewDelegate(a);
       NewDelegate dgt2=new NewDelegate(b);
  //dgt1指向方法a,dgt2指向方法b。也就是说一个方法的返回值和参数类型数量与声明的委托
//相符时,就可以用一个委托来调用这个方法。而这个方法的名称作为参数传递给实例化的那个委托
}

事件是一种特殊的委托,用反编译工具反编译.net framework即可发现,事件的定义(这里只是举其中一种事件的定义,事件的参数在类库中定义有区别),如下:
public delegate void EventHandler(object sender, EventArgs e);
而常见的各种控件的Click事件是如何定义的呢?
public event EventHandler Click;
说明 Click事件是一个委托
而我们常见的一个Button控件添加一个事件是怎么做的呢?
PageLoad里:Button1.Click+=new EventHandler(Button1_Click);
定义Button1的事件 protected Button1_Click(object sender,EventArgs e){}
如你所见,这是一个很典型的委托调用。

评分

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

查看全部评分

回复 使用道具 举报
委托是一种特殊事件,在c++里有指针。在.net里有委托,委托的作用就相当一指针。
事件有sender(发送方),但是事件不知道接受方是谁,这时候就需要委托去指向对应的接收方.

评分

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

查看全部评分

回复 使用道具 举报

事件是官方已经预先定好的委托,委托的调用不是用户控制的,,net会自动执行。
自己定义的委托是需要用户控制才会执行的

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 刘俊红 于 2012-10-5 22:03 编辑

还没搞懂,在很多地方看到的说法是:
    事件是被简化的针对特殊用途的委托。

但是:
事件是成员而不是类型,委托是类型,因为事件表现了如下特征:
  • 不能使用对象创建表达式(new)来创建对象。
  • 事件必须声明在类或结构中,和其他成员一样;
  • 不能在一段可执行代码中声明事件。
  • 事件成员被隐式自动初始化为null


评分

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

查看全部评分

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