您的位置:首页 > 编程语言 > C#

C# 委托 事件

2014-05-26 09:13 162 查看

问题来源:

敲三层登陆页面的例子,但是总是出现一个重复的错误,那就是






错误提示为:






查了半天都不知道到底是哪的错误,看见前面的EventHandler,就知道了肯定是委托的问题了。

EventHandler是一个声明委托的微软C#的命名标准。

问题理解:

new System.EventHandler(this.Form1.Load)建立的就是一个委托类型的实例,让该委托指向了this.Form1.Load方法,也就是说在程序运行的某一时刻,系统会通过这个委托实例间接的调用这个方法。

详细分析:

解决上述问题的方法,就是把Form1.Designer中的这句话去掉,然后单击Form1_Load,直接输入想要显示的窗口,如:






这样写程序就会自动添加委托,而无需自己添加了。

问题延伸:

仔细观察,在C#中的事件方法中都带了“Object sender,EventArgs e"这两个参数,这不就是和委托相似吗?所以上述问题才可以相互转化。

引言:

委托是什么?当听到这个词语的时候,已经赋予了我们想象的空间,假如我要做一个动画版的小程序,Flash部分并不是我所熟悉的,那么我就把Flash那部分委托给了我的同学,让他去完成,这就是所谓的委托。把自己所不能做的事情让其它人去完成。

委托是一个类,它定义了方法的类型,使得可以讲方法当做另一个方法来进行传递,这种将方法动态的赋给参数的做法,可以避免在程序中大量的使用If …… else语句,使得程序具有更好的可扩展性。

与指针的比较:

在c#中,对于其作用是这样描述的:委托就像一个函数的指针,在程序运行时可以使用它们来调用不同的函数,回到上述做小程序的例子,加入我有两个同学可以完成自己交代给他们的任务,只要能够满足自己的需要(接口),尽管两个人做的过程不一样,并且做出的效果也不一样,但是只要能够达到我的要求就可以了。

除此,委托可以引用实例和静态方法,而函数指针只能引用静态方法,其实对于指针的使用,大多数还是在c/c++中,函数的地址就是一个内存地址,不携带任何额外的信息,说通俗点就是不带有感情色彩,但是委托就不一样了,委托是面向对象的,而且类型是安全的。委托会检测它保存的函数引用是否和生命的委托匹配,尽职尽责。

事件:

事件常用Event来表示,也就是一个用户操作,如单击,鼠标移动等等。事件在类中声明且生成。

声明事件:

在类的内部声明事件,首先必须声明该事件的委托类型。如:

<strong>public delegate void MemoryLogHandler(string status)</strong>


然后声明事件本身:

<strong>//基于上面的委托定义事件
    public event MemoryLogHandler MemoryEventLog;</strong>
上面两句代码则是定义了一个名为MemoryLogHandler的委托和一个名为MemoryEventLog的事件,该事件在生成的时候会调用委托。

委托举例:

就说上述编写动画小程序的例子吧!

<strong> //***Flash的同学类
    public class Student
    {
        public static void WriteFlash()
        {
            Console.WriteLine("对Flash的工作,我会认真完成的");
        }
    }
    class Oneself  //自己
    {
        //声明一个委托,其实也就是一个命令
        public delegate void WriteFlashEventHandler();

        public static void Main(string []args)
        {
            //这里主要是阐述这个命令是干什么的,让会Flash的同学帮助自己***Flash
            //这是委托的声明方法,后边一定要加上委托的方法Student.WriteFlash,因为委托的构造函数不能为空
            WriteFlashEventHandler myDelegate = new WriteFlashEventHandler(Student.WriteFlash);
            //委托被附上了具体的方法
            myDelegate();
            Console.ReadKey();
        }
    }</strong>
学习到这,就不得不涉及到“委托链”的概念了,除了Flash的任务需要让自己的同学完成外,自己还需要对其个别的按钮来美化一下,也就是说让自己的同学做第二件事情,这个过程就叫做“委托链”了!

<strong>myDelegate += Student.BeautifulCommand</strong>
加上这句代码之后,这时候就是执行的两个事件了。

总结(区别):

要说这两者到底有什么区别呢?可是定义事件就是一个狭义的委托。对于委托,它可以直接安排谁是他的调用函数,也可以直接调用,而对于事件则不行,它只能通过某些操作出发。进而可以了解委托的主要用途是方法调用,函数回调和事件,而事件主要用于外发消息。






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: