问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-24 00:30

我来回答

2个回答

热心网友 时间:2022-04-24 01:59

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

热心网友 时间:2022-04-24 03:17

事件就是一个委托,
这个有点多,那天有空发
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
求大学生谈恋爱的各种弊端 大学生恋爱的利大于弊吗? 大学生谈恋爱的弊处 dnf现在站街16000的物攻 增加100物攻能张多少 家里养的蚕宝宝是要蜕皮了吗 富贵包硬和软的区别 【已完成】为什么腋窝突然有异味? 女生为什么有狐臭症状? 为什么会狐臭 万视宝这个牌子是做什么的?有人了解嘛? 惠普光影精灵4笔记本装WIN7系统~! 光影精灵4插图传线卡死 惠普光影精灵3没有无线网络图标,只有一个飞行模式,是怎么回事? 光影精灵笔记本玩CF频繁出现网络异常 光影精灵四风扇网卡天线如何安装回去 您好,我的光影精灵5搜索不到周围网络及热点,检测路由器是正常的,手机都可以连接,请问如何解决? win10笔记本驱动出了问题 我买的光影精灵不到一年无线网卡坏了,这正常吗?没磕没摔。我要邮到售后,别人会把我里面的东西给换了吗 今天刚刚给惠普光影精灵4装了黑苹果,wife,蓝牙没法用,有什么办法装驱动呢? 我的特殊沟通技巧是什么? 路从今夜白结局是什么 魏子健扮演者魏哲 陈都灵和刘恺威是什么关系? 我有特殊沟通技巧网剧在哪播? 双面神探剧情介绍 路从今夜白的大结局是什么 电视剧《我有特殊沟通技巧》演员有哪些? 园林专业主要是学些什么?可是我是文科生...能报吗? 大学园林设计专业需要是美术生吗?涉及到画画的方面多吗?偏理科还是偏文科?就业前景怎么样?顺带问一下 柠檬水怎么泡好喝 如何做柠檬水喝。 日常好穿又百搭的女鞋有推荐吗? 昨天在天美意专柜买了双女凉鞋,今天穿了两小时掉皮了,专柜能换吗? 女生穿九分裤搭配什么鞋好看? 推荐几款笔记本,主要是用来绘图,剪辑视频,用ae和pspr之类的,7000左右 联想哪款笔记本适合剪辑视频和绘图? 适合绘图软件,剪辑软件的笔记本 求笔记本推荐 价格适中 主要用来绘图(sai和ps)和剪辑 (pr ac)偶尔打 大退游戏是什么意思 大退三合是什么意思 抱大退什么意思 小退游戏是什么意思 昨天晚上做了梦,梦见被蛇咬到了大退,还挤出了好几个像蜂儿一样的东西什么意思 大退月什么意思 在黄道节日里的大退和天赦是什么意思 己巳时 冲猪 煞东 时冲癸亥 勾陈 大退 帝旺 左辅是啥意思 冲猪 煞东 时冲癸亥 大退 明堂 五合 传送是什么意思 阴阳差错,主克妻伤子,出游荡之人,家业大退.什么意思 被盗了封了怎么办? 有没专业做房产中介管理软件的,靠谱的那种? 无线路由器基本参数的模式是什么意思