c#事件到底怎么写,谁能给举个最简单的例子,包括定义事件,订阅事件,触发事件的完整流程 20

如题,事件必须用委托写吗?请帮我举个最简单明了的例子,一直对委托和事件搞不清楚。vs版本是2013的,谢谢各位大牛。只要事件的验证流程和简单例子就可以,不要委托的。另外,... 如题,事件必须用委托写吗?请帮我举个最简单明了的例子,一直对委托和事件搞不清楚。vs版本是2013的,谢谢各位大牛。
只要事件的验证流程和简单例子就可以,不要委托的。另外,时间必须和委托联系在一起才能形成吗?如果是的话,那就写上吧。
展开
 我来答
wjbdezhidao
2015-03-25
知道答主
回答量:10
采纳率:0%
帮助的人:9.6万
展开全部
using System;

namespace EventExample
{
    public delegate void MyEventHandler(Object sender, EventArgs e);

    public class EventExample
    {
        public event MyEventHandler FindSeven;

        private Random _NumberCreator = new Random();

        public void MessageLoop()
        {
            while(true)
            {
                if(_NumberCreator.Next(8) == 7)
                {
                    if(FindSeven != null)
                    {
                        EventArgs e = new EventArgs();
                        FindSeven(this, e);
                    }
                    break;
                }
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            EventExample myEventControl = new EventExample();
            myEventControl.FindSeven += new MyEventHandler(MyFindSeven);
            myEventControl.MessageLoop();
        }

        public static void MyFindSeven(Object sender, EventArgs e)
        {
            Console.WriteLine("Find Seven");
        }
    }
}

上面是一段简单的自定义事件处理代码

首先解释一下委托。委托相当于c语言中的函数指针,用来引用参数相同但处理不同的函数,可以看作是 签名相同的函数 的共同别名。在事件处理中,它用来回调自定义的事件处理函数。上面的MyEventHandler委托可以用来代替所有参数为:第一个是Object类型、第二个为EventArgs类型,返回值为void的函数,例如Program类中的MyFindSeven函数。委托是一种类型结构,与类、结构体、枚举一样,因此它可以直接在命名空间中声明,不必放在某个类中。delegate 关键字相当于class关键字,MyEventHandler相当于EventExample。实例化委托时,可以以函数作为参数。例如MyEventHandler handler = new MyEventHandler(MyFindSeven)实例化了MyEventHandler委托。此后handler就可以代替MyFindSeven函数。调用函数时,handler(this,e)与MyFindSeven(this,e)等同。

事件的设计主要包括:定义事件、编写事件处理代码、绑定处理函数等步骤。

定义事件时,事件必须以成员的身份出现。定义事件使用event关键字,后面跟处理事件的委托类型(MyEventHandler),使用委托是语法规定,可以查看C#语法规范Ecma334中关于事件声明的描述。为了使事件的触发处理尽量简单,我将事件的触发和接收处理都放在了EventExample类中。类成员FindSeven表明EventExample类可以接收事件,成员函数MessageLoop用于触发FindSeven事件,当随机数为7时,触发事件。判断FindSeven是否为空是为了检查事件是否已经绑定自定义处理代码。

主函数中,首先实例化事件引发和接收事件的类EventExample,接着为FindSeven绑定处理函数,最后调用MessageLoop触发事件。

在事件中使用委托的好处在于,当事件触发时,底层代码可以直接调用委托,不用关心事件处理的自定义函数。EventExample相当于button一类的控件,事件触发时,.NET底层代码直接调用Click一类的委托,只要编程人员通过…Click += new EventHandler(事件处理函数)这种方式将自定义处理函数绑定到事件上,就可以保证编写的代码会参与到事件的处理中。

关于C#中事件的详细描述,可以查看《C#入门经典》、《C#高级编程》、《CLR via C#》这些书籍。

dyzeke
2015-03-25 · TA获得超过208个赞
知道小有建树答主
回答量:676
采纳率:60%
帮助的人:325万
展开全部
事件就是一个委托,
这个有点多,那天有空发
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式