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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 岁月渲染 中级黑马   /  2013-11-2 15:45  /  1520 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 岁月渲染 于 2013-11-3 14:03 编辑

请大姐大哥介绍一下这两个问题

评分

参与人数 1技术分 +1 收起 理由
haxyek + 1

查看全部评分

7 个回复

倒序浏览
事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。
在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型 (Delegate),该类型提供函数指针的功能。
委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调。虽然委托具有许多其他的用途,但这里只讨论委托的事件处理功能。一个委托声明足以定义一个委托类。声明提供委托的签名,公共语言运行库提供实现。

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

回复 使用道具 举报
委托是一种引用方法的类型。它具有与被委托委托方法完全相同的行为。
委托可用于定义回调方法,也可以将方法作为参数进行传递。
事件就是一个私有的委托变量,加上add()方法后能够在外界使用-=进行赋值操作,
加上remove()方法后能够在外界使用+=进行移除指定方法。
简单地说 委托是类型,事件是变量,只有声明委托才能声明事件。

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

回复 使用道具 举报
委托是一种引用类型,类似于其他语言的函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。
理解委托的一种好方式是把委托当作给方法签名和返回类型指定名称。

事件是一种特殊的委托,事件的内部是用委托实现的。
理解事件首先要理解事件接收器与事件发送器。
事件接收器是指在发生某些事情时被通知的任何应用程序、对象或组件。当然,有事件接收器,就有事件发送器。发送器的作用是引发事件。发送器可以是应用程序中的另一个对象或程序集,在系统事件中,例如鼠标单击或键盘按键,发送器就是 .NET 运行库。注意,事件的发送器并不知道接收器是谁。这就使事件非常有用。

在用法上委托和事件有很多区别。委托用法自由,申明了一个委托,哪里都能用,只要符合方法签名。事件就有很多局限性,比如注册事件用+=、注销事件用-=,外界不能触发事件等。
我觉得委托和事件是个难点,非几句话能说明白,自己也理解的不到位。最好结合网上一些案例去深入体会。

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

回复 使用道具 举报
关于委托,可以这么理解,平时我们在定义方法的时候, 传入的参数都只是简单类型和类类型或结构体,使用委托时, 我们可以将方法作为一种类型。
定义委托时,跟定义变量相似(只是跟定义变量类似,但这里并不是定义变量,而是定义一个类型,就像定义一个自定义类,只是它的定义方式更像定义变量),首先我们需要访问级别(public、internal、private...),然后就是变量类型delegate,如果是其他变量,后面紧跟着的当然是变量名,但因为委托实际上是定义了一个方法类型,所以作为一个方法,其必需的就是返回类型,方法名和参数列表,所以以下是委托的定义格式:
访问级别 变量类型(delegate) 返回类型 方法名(参数列表);
eg: public delegate double Calculate(double a, double b);
经过上面的委托定义, 我们就可以将Add作为一个类型。假如我么有如下的类:
  1. public class Calc
  2. {
  3.     public double Add(double x, double y)
  4.     {
  5.         return x + y;
  6.     }
  7.     public double Sub(double x, double y)
  8.     {
  9.         return x - y;
  10.     }
  11.     public double Div(double x, double y)
  12.     {
  13.         return x * y;
  14.     }
  15.     public double Mul(double x, double y)
  16.     {
  17.         if (y == 0)
  18.         {
  19.             throw new Exception("除数不能为零");
  20.         }
  21.         return x / y;
  22.     }
  23. }
复制代码
当你执行下面的代码,就代表你执行了Calc的Add方法,并返回2
  1. Calculate calc = new Calc().Add;
  2. calc(1, 1);
复制代码
对于事件,实际上就是对委托的一种封装,事件的一个特点是,只有对象本身才可以触发事件。

顺求技术分,10期要开了, 正在抓紧写博客和拿技术分{:soso_e149:}

评分

参与人数 1技术分 +1 收起 理由
陈福军 + 1

查看全部评分

回复 使用道具 举报
http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html
这里有个很详细的讲解,我正在研究。。。。
回复 使用道具 举报
是不是委托可以把方法当作参数来传递啊
回复 使用道具 举报
奔跑的胖子 发表于 2013-11-2 21:18
是不是委托可以把方法当作参数来传递啊

嗯, 我上面给了一个简单的例子,可以看看,代码不算完整,要理解哦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马