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

2024-11-24 23:35:55
推荐回答(2个)
回答1:

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#》这些书籍。

回答2:

事件就是一个委托,
这个有点多,那天有空发