2006-11-30

对C#下函数,委托,事件的一点理解!

来源: 本站收集整理 作者:佚名 评论 0 条
 

Mydelegate m_delegate;//申明一个委托

event MyDelegate m_myevent;//申明一个事件

很像吧!不是吗?

OK,我们再来看,m_myevent 与m_delegate到底有什么不同的?也就是,事件(非凡委托)到底非凡在什么地方?

1、事件不是一个可以直接把函数当值一样赋给它的委托。而委托可以直接赋函数,而且是在实例化的时候,赋函数名。

2、事件只能把一个实例的委托当值赋给它。也就是说:事件是用来治理委托的,进而来治理函数!因为一个实例化的委托一定有一个函数与之对应。

3、在事件上可以动态的添加与删除委托。而委托上不能动态的添加删除函数。

OK,下面的一个问题,上面事件的申明中,MyDelegate是起什么作用的呢?

还记得前面的委托申明吗?它就是说明了m_myevent在运行时可以动态的以委托的形式赋的函数要与MyDelegate申明的一样!

因此上面的一个实例化是完全合法的。

再理解一下:事件,是用来动态治理委托的,而委托是单一的与一个函数对应的。

现在看第二个问题,运行时,如何知道该“非凡委托”是否已经被赋过函数值?及如何再赋值?

即:如何知道一个事件上已经赋过经过委托过的函数?

前面已经说过,m_myevent没有给它赋值,如何给它赋值呢?它的赋值方法有点怪:

一个实例:

m_myevent = m_delegate;

有点怪吧!这里正好说明了:事件是用来动态治理委托的。把一个委托加在事件上。

当然,你还可以在添加委托的时候直接new一个新的委托:

m_myevent =new MyDelegate(Class1_m_myevent);//后面的函数名由vs2003生动生成

这就是.net下标准的给事件添加委托的方法,也就是给一个事件添加了一个可调用的函数。确切的说,是一个回调函数(C++的概念)。

OK,下面就如何判定一个事件上是否已经被赋过经过委托的函数:

if(m_myevent==null)

就可以知道了!

那么如何知道一个事件上面有多少个委托呢?也就是多少个委托过的函数?

m_ myevent.GetInvocationList();

可以得到所有的委托!这里应该知道:事件本身是一个对象,当实例化一个事件后,它是有自己的一些方法也成员的。可以查阅MSDN得到更多说明,同样的委托也是一个对象,相关的说明也可以在MSDN里找到。

最后的问题:如何删除一个已经添加在事件上的委托?

太轻易而且太有意思了:

m_myevent -= m_delegate;

那么这样的几个问题又来了:

1.假如这个事件上没有该委托,“减掉”以后会出错吗?不会,放心的减吧。

2.如何调用这个事件上的委托呢?上面有多个委托,它是怎样运行呢?

调用事件上的委托与调用委托上的函数是完全一样的:你要给出与委托申明一样的函数参数,并且调用会返回与申明一样的数据类型。

最后再回来看这个问题:

object m_obj = m_isRight?MyWrite("true"):MyWrite("false");

如何解决它呢?把一个函数赋给一个对象:一个例示(仅做演示解决这个问题,个人认为这样的做法没有实用意义)


using System;
namespace ConsoleApplication1
{
public class Class4
{
event System.EventHandler m_obj;
public Class4()
{
System.EventHandler m_f1 = new EventHandler(SomeFunc1);
System.EventHandler m_f2 = new EventHandler(SomeFunc2);
bool m_someCondition = false;
m_obj = m_someCondition?m_f1:m_f1;
m_obj(this,null);
}

private void SomeFunc1(object sender, EventArgs args)
共5页: 上一页 [1] [2] 3 [4] [5] 下一页

(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:Java开源技术:Eclipse的使用技巧详解  
下一篇:C 和C#的语法和功能区别
    评论加载中…
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号