hoho,要求好高啊。这个还是找本好书看看吧!
我个人的理解,委托就是C中间的函数指针,C++中间也沿用了这一概念,但是因为OO的加入,使得C++中的函数指针与C中的函数指针有了一点区别,感觉使用起来很别扭,而且让人不好理解(你可以找相应的例子比较一下).估计microsoft也感觉到了,所以加入了delegate的概念,取代函数指针。
至于event,我开始感觉毫无作用,不过据说是为了兼容VB这种没有函数指针概念的.NET语言而加入的keyword。
我也就知道这些了,希望各位老大指点一下event还有什么作用。
我个人的理解,委托就是C中间的函数指针,C++中间也沿用了这一概念,但是因为OO的加入,使得C++中的函数指针与C中的函数指针有了一点区别,感觉使用起来很别扭,而且让人不好理解(你可以找相应的例子比较一下).估计microsoft也感觉到了,所以加入了delegate的概念,取代函数指针。
至于event,我开始感觉毫无作用,不过据说是为了兼容VB这种没有函数指针概念的.NET语言而加入的keyword。
我也就知道这些了,希望各位老大指点一下event还有什么作用。
比如定义一个Click事件:public delegate void EventHandler (obj o, EevntArsg);public event EventHandler SimpleEvent;
这样就定义了一个SimpleEvent事件,下面为事件添加处理函数:
SimpleEvent += new EventHandler(OnSimpleEvent);
void OnSimpleEvent(object o, EventArsg e)
{ ...
}
而这个(确切的说应该是这种)事件由什么函数来处理,则需要使用委托(代理)指定
不知道这样的语句楼主注意过没有
this.btnExit.Click += new System.EventHandler(this.btnExit_Click);
他说明btnExit.Click事件指定btnExit_Click函数处理,这里的委托是System.EventHandler
private void btnExit_Click(object sender, System.EventArgs e)
{
Application.Exit();
}
根据你所说的,一个event(如SimpleEvent)应该保证他的参数格式如下:
public delegate void EventHandler (obj o, EevntArsg);可是我看书中Begining C#(C#入门经典)P260页的sample.其中delegate:
public delegate void MessageHandle(string text);
public event MessageHandler MessageArrived;
并没有完全按照你所说的规则定义,给我的感觉,这个关键字event好象没有作用一样,因为程序中把这个event去掉一样可以运行.望:八月和其他高手解答我的疑惑.
谢谢楼主问了一个好问题.
委托其实就是一个对象,一个和他的参数与返回相匹配的的方法的引用,如:
在类A中有方法: public void add(int x , int y)
{
//........
}
public void sub(int w, int y)
{
//..........
}
那么可以申明委托是:
delegate public void dg1 (int a,int b);
在另一个类 B 的另一个方法中可以实例化委托dg1,将他引用add或和sub方法,并调用这 个委托所引用的方法,让类 A 实例化后去执行相应的方法
事件也是委托,也是申明和方法匹配的委托:只是参数严格要求了的,如下:
public void method(object sender ,myEventArgs arg)
//myEventArgs是自定义类,继承System.EventArgs
{
//..........
}
委托是: delegate public void dg2(object sender ,myEventArgs arg );
只是在申明事件时是:
public event dg2 newEvent; //使用了event关键字
然后在其他方法中调用该事件
我越来月觉得委托和事件除了声名时不同,没有多大区别了
我对委托和事件的理解还很片面,有不对的地方,请大家提出来讨论,谢谢!
意见不见的正确,欢迎高手发表高见..
嘿嘿!在我看来,delegate已经确定了指向的function的类型,包括参数和返回值。而event的作用到现在为止看到的只是定义这是event,似乎只是告诉我们这些写代码的人这是个event,可是对于编译器,似乎没有起到什么作用,由他没它对于编译的结果没有什么影响。
所以,我最想知道的是:在加了keyword event的delegate和没有这个keyword的有什么区别
event 可以认为是托管的一个方法入口地址列表。
而通常的定义
event aaaa bbbb;
这种定义也就是定义了一个名为bbbb的托管方法入口地址列表,并且要求
这个地址列表中的所有方法都具有aaaa这个delegate规定的调用签名而已。而程序在运行时,当发生某种事件时,会去检查相应的入口地址列表,逐个执行
里面的方法。这是我的理解。
然后我有猜测它是产生一个thread,结果还是完全一样。如阿亮所说,是先有事件ID,然后再根据事件类型查找入口。可是就我所知,我们早就知道我们event定义的时间指针对象,即楼上的那个bbbb。那么编译器为什么不直接把事件入口定位bbbb,至于bbbb之后指向的地址,由runtime来决定,何必再在发生的时候查找这个列表呢?还是有点迷惑
我昨天又尝试看看event是否能够修饰任何种类的delegate,结果都可以
然后我有猜测它是产生一个thread,结果还是完全一样。如阿亮所说,是先有事件ID,然后再根据事件类型查找入口。可是就我所知,我们早就知道我们event定义的时间指针对象,即楼上的那个bbbb。那么编译器为什么不直接把事件入口定位bbbb,至于bbbb之后指向的地址,由runtime来决定,何必再在发生的时候查找这个列表呢?还是有点迷惑
你现在问的是为什么要动态绑定吧?
可以考虑一下继承时候的情况啊。