初学c#~请教个问题~谢谢~
<p>初学c#~请教个问题~谢谢~</p><p><img src="http://img.baidu.com/img/iknow/icn_point.gif"> 悬赏分:0 -</p>
<p>解决时间:2010-3-11 13:11</p>
<p>额~感谢一直帮助我的前辈们~今天看到了“引发类的事件”~又有个例子没弄明白~</p>
<p>delegate void MyEventandler(object sender,EventArgs e); //这俩个参数有什么实际意义么?</p>
<p>class EventClass</p>
<p>{</p>
<p>public event MyEventHandler MyEvent; //事件</p>
<p>protected void OnMyEvent(EventArgs e)//引发事件的函数</p>
<p>{</p>
<p>System.Console.WriteLine("EventClass:ready to fire aMyEvent!");</p>
<p>if (this.MyEvent != null) //判断事件是否为空,可是这个函数中的MyEvent事件只是刚刚声明过,他有内容么?没有的话就是空了?</p>
<p>{</p>
<p>System.Console.WriteLine("EventClass:fire a MyEvent!");</p>
<p>this.MyEvent(this,e); //这句话我没看懂</p>
<p>}</p>
<p>}</p>
<p>public void FireAEvent()</p>
<p>{</p>
<p>this.OnMyEvent(EventArgs.Empty); //调用OnMyEvent?可是括号内是什么意思啊?</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>非常感谢各位前辈能在百忙中抽出时间帮我解答疑惑~真诚的感谢您!~</p>
<p>提问者: jiashitiancai - 四级</p>
<p>最佳答案</p>
<p>学习事件 首先要理解事件是什么概念</p>
<p>所谓事件呢 当然就是发生了某一件事的一个通知</p>
<p>比如一个叫“民工”的类定义了一个“活儿干完了”事件</p>
<p>那么这个事件的作用就是当民工干完活儿的时候告诉别人他把活儿干完了</p>
<p>这样别人(比如包工头儿)就知道他干完活了,可以进行下一步的处理,比如让他干别的活儿</p>
<p>其次 要理解什么是delegate 就是委托 它的作用是给一类具有特定签名(signature)的方法(method)起一个名字,如果学过C++,可以把委托理解成为类型安全的函数指针。本实上委托也是一个类,而所有具有其规定的特定签名的方法都可以作为它的实例(方法的签名是指方法的参数类型个数和返回值类型)</p>
<p>一个类定义的一个事件,也就是一个委托的实例,它可以被赋值成某一个</p>
<p>符合其签名规定的方法,当然一开始它是null,当它不是null的时候,也就是它被赋值到(可以理解为指向)一个方法时,调用它,也就是调用它指向的那个方法</p>
<p>好了,我们现在来看民工的例子</p>
<p>首先我们先要规定方法的签名</p>
<p>public delegate void 活干完了的委托(object 谁触发了事件, EventArgs 需要的参数);</p>
<p>由此可以看到,这个委托规定,方法要带两个参数,第一个object类型,用来表示是谁触发了事件,第二个EventArgs表示与事件相关的需要传递的参数,而返回值为void</p>
<p>下面定义民工类</p>
<p>public class 民工</p>
<p>{</p>
<p>public event 活干完了的委托 活干完了;</p>
<p>//活干完了事件是活干完了的委托的一个实例</p>
<p>protected void 当活干完了时(EventArgs 需要的参数)</p>
<p>{</p>
<p>if(活干完了!=null)//如果活干完了指向了某一个方法</p>
<p>活干完了(this, 需要的参数);//那么就调用这个方法,是this触发了事件(即当然民工的一个实例,即某个民工, 需要的参数待定)</p>
<p>}</p>
<p>public void 干活()</p>
<p>{</p>
<p>//...干活干了N小时</p>
<p>//...终于干完了,可以发出事件了</p>
<p>当活干完了时(null);//不需要什么参数,就传一个null</p>
<p>}</p>
<p>}</p>
<p>我们来看看别人如果利用民工的这个事件:</p>
<p>//比如我是包工头,我首先找来一个民工</p>
<p>民工 民工A = new 民工();</p>
<p>//我先设置好当此人干完活时要进行的动作</p>
<p>//比如我有一个方法是void 付钱(object 谁干完活了, EventArgs 有什么参数要传递)</p>
<p>//可以看到,方法付钱是符合活干完了的委托的</p>
<p>民工A.活干完了 += 付钱; //注意使用+=,这称为订阅一个事件</p>
<p>//现在我让此人开始干活</p>
<p>民工A.干活();</p>
<p>//这样,当民工干完活的时候,我的方法付钱就会被调用,在付钱方法里,我就可以进行我自己的处理</p>
<p>void 付钱(object 谁干完活了, EventArgs 有什么参数要传递)</p>
<p>{</p>
<p>//民工A干完活时,谁干完活了=民工A,有什么参数要传递=null</p>
<p>//我可以进行其他想要的处理...</p>
<p>}</p>
<p>最后解释一下+=操作符</p>
<p>一般的,我们可以让事件指向一个方法(直接赋值),而使用+=,我们可以让事件指向多个方法,这样调用这个事件,就调用了它所指向的所有方法</p>
<p>比如我是另外一个包工头,我也想知道民工A什么时候干完活,我好让他干别的活,</p>
<p>那么我可以让民工A的这个事件也指向“干别的活”方法</p>
<p>即:民工A.活干完了 += 干别的活;</p>
<p>这样,当民工A干完活的时候,不但方法“付钱”会被调用,“干别的活”也会被调用。</p>
<p>也就是说,谁想知道民工A什么时候干完活,就订阅他的这个事件,那么到时候,所有订阅的人都会得到通知(即他们提供的方法都会被调用)</p>
<p>========================================================</p>
<p>累死我的,你明白了没……觉得不错可以追加分鼓励啊 哈哈!</p>
<p>0</p>
<p>回答者:</p>
<p>rodericksu - 七级 2010-3-11 02:24</p>
<p>我来评论>></p>
<p>提问者对于答案的评价:</p>
<p>您的回答方法很形象啊~比较好理解~同时也谢谢其他帮我解答的前辈们!~麻烦你们了~系统追加最多只能50分啊</p>
页:
[1]