日期:2014-05-17  浏览次数:20393 次

.NET委托和事件
有大神吗,帮我解释下委托和事件的关系呗,还有什么时候能用上委托和事件。

------解决方案--------------------
引用:
有大神吗,帮我解释下委托和事件的关系呗,还有什么时候能用上委托和事件。


http://baike.baidu.com/view/1935199.htm
你可以看下这个 很不错
------解决方案--------------------
该回复于2013-03-11 03:00:24被管理员删除

------解决方案--------------------
委托是对函数的封装,可以当做给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义事情时,事件对象处理通知过程。    注意:委托是一种饮用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托对象用关键字delegate来声明。而事件是说在发生其他类或对象关注的事情时,类或对象可通过事件通知他们。事件对象用event关键字声明。
------解决方案--------------------
个人理解:

C# 是一种强类型的语言,既然是强类型,那么所有的对象都应该有类型。既然这样,那么方法属于什么类型呢?其实 委托 就是方法的类型。

//定义语法
//访问修饰符 delegate 返回类型 委托名 (参数列表)   //返回类型 和 参数列表称为[签名]
//[public/protected/private] delegate returnType delegateName(paramtype param1,…)
//
//委托可以分配多个方法,但只能分配[签名]相同的方法,分配多个方法的委托可以叫多路广播
/*
//MSDN中的解释
//委托是可保存对方法的引用的类。与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用。这样,委托就等效于一个类型安全函数指针或一个回调
*/



而方法,则是一种特殊的委托,比如说我点击 Button 的时候,程序本身不知道该如何处理这个 Click,于是就给它动态注册了一个方法,并把这个方法分配给了 这个 Click 事件,(你可以右键进去看 Click 事件,是一个 关键字为 event 的委托,而那个注册的方法则是分配给了这个事件)。
额,,好吧,希望没晕。。这个刚开始理解起来貌似是有点见鬼!~


------解决方案--------------------
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。
事件是委托的一种。
这个帖子很不错:http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html
------解决方案--------------------
C#中事件的一般用法

FCL中的定义
public delegate void EventHandler<TEventArgs>(object sender,TEventArgs e) where TEventArgs:EventArgs
...
所以方法原型必须是viod Method(object sender,TEventArgs e)
事件的定义:
public event EventHandler<TEventArgs > OnXXXX;
从而可以看出事件是建立在委托的基础上。。
一般是发布-订阅模式
通过触发OnXXXX来回调订阅者的Method

------解决方案--------------------
google 张仔阳的委托和事件

简单来说就是
MyWantToDoSomething()
{
     //但这里有一些我还是不清楚情况的
//比如我实现了点击一个按钮就会干些事情,但这些事情我还不知道要干什么
//于是我就申明一个事件 比如点击了按钮OnClick
}

别人就可以注册监听这个事件 然后补充要实现的逻辑
下面这个你应该很熟悉吧
 <asp:Button ID="btnSubmit" Text="提交" onclick="btnSubmit_Click" />

微软在做这个按钮的时候 肯定不知道我们想要点击按钮后要实现什么功能
所以就使用了onclick事件  然后我们可以用btnSubmit_Click来监听它
自己实现逻辑

btnSubmit_Click(可以自己命名)但要符合函数签名 委托是一种类型,定义了函数的签名
void btnSubmit_Click(object sender, EventArgs e)

AAA
void AAA(object sender, EventArgs e)

AAA
void AAA(int sender, EventArgs e)//签名不一致,



------解决方案--------------------
参考的delegate and event例子:
http://www.cnblogs.com/insus/tag/delegate/
------解决方案--------------------
http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html
看懂 在问吧   经典的.
------解决方案--------------------
委托就是把一个方法作为参数带入另外一个方法,有点像C++中的,指向函数的引用,事件是一种特殊的委托,要想熟练的使用委托和事件你得弄清楚那个是观察者那个是被观察者