深圳住房和建设局网站 招标,wordpress的模板目录在哪里设置,知乎网站建设用的工具,市政道路毕业设计代做网站我最先在学习C#事件的时候#xff0c;阅读了许多书籍#xff0c;但总是不能对事件建立起一个比较清晰的概念#xff0c;对其内部机制和原理也是似是而非#xff0c;因为这些书籍在描述事件的时候总是夹杂许多其他不能理解的抽象术语#xff0c;相信许多初学者都有这样的感…我最先在学习C#事件的时候阅读了许多书籍但总是不能对事件建立起一个比较清晰的概念对其内部机制和原理也是似是而非因为这些书籍在描述事件的时候总是夹杂许多其他不能理解的抽象术语相信许多初学者都有这样的感觉。同时在利用IDE进行GUI编程时IDE总是在内部帮助我们实现了事件必须的一些代码我们只需双击对象编
事件处理函数就行了而我们常常对内部的工作一无所知或没有去主动理解这些自动生成的代码。现在我试着回答学习时遇到的几个问题这将会有助于你理解到底什么是事件。如何定义一个事件语法修饰符 event关键字 委托类名 事件名比如public event somedelegatename myeventname;事件到底是什么类型引用值事件其实就是一个特殊的委托。MSDN中的C#参考里这样描述事件是特殊类型的
多路广播委托仅可从声明它们的类或结构发行者类中调用。如果其他类或结构订阅了该事件则当发行者类引发该事件时会调用其事件处理程序方法。对于这一点我们也可以从事件的定义中看出不过就是在定义委托对象时加了event关键字表明这个委托现在叫事件。何谓事件的订阅subscribe我们用VS2005建立一个只有一个按钮的winform程序双击按钮设计器会在Form1.Designer.cs中自动生成一行代码this.button1.Click new System.EventHandler(this.button1_Click);这就是事件的订阅
其实就是用事件处理函数this.button1_Click来实例化一个委托System.EventHandler这个函数与委托拥有同样的签名为什么需要有同样签名我理解就是要保证委托与函数的类型一致这样才能把函数句柄赋给一个委托对象即所谓的用委托封装方法或C中把一个方法句柄赋给一个
函数指针并把这个委托对象赋给事件Click因这Click其实就是一个委托引用所以可以这样做从C的角度来理解就是把事件处理函数赋给了一个函数指针变量这样就可以通过调用这个函数指针以执行事件处理函数一句话订阅事件就是将某个委托对象指向一个具体的方法。什么是引发事件当程序中满足某个条件时调用事件就是引发了事件为什么可以调用事件呢因为事件就是一个委托而委托具有C中
函数指针的作用调用委托就是调用委托中封装的
事件处理函数为什么事件可以被多个对象订阅知道了事件实际是一个多播委托后这个问题不难理解所谓被多个对象订阅就是事件被触发后可以导致多个对象做出反应也就是多个对象的某个
事件处理函数被调用。为什么会这样呢因为事件是多播委托即封装了多个函数的委托调用这个委托实际上就是在调用被封装的这多个函数。下面用一个最简单的控制台程序例子来说明事件的运作方式using System;
namespace 最简单的自定义事件
{/// summary/// 事件发送类即调用事件的类/// /summaryclass Class1{public delegate void mydelegate(object sender,EventArgs e); //定义委托public event mydelegate myevent; //定义一个委托类型的事件,即定义一个委托对象public void run(){//死循环不停测试某个条件是否满足即所谓的监听while(true){if(Console.ReadLine()a){myevent(this,new EventArgs()); //调用事件}}}}/// summary/// 事件接收类即事件处理的类/// /summaryclass Class2{static void Main(string[] args){Class1 c1 new Class1();c1.myevent new Class1.mydelegate(c1_myevent); //将委托对象指向具体的事件处理函数即所谓的订阅事件c1.run();//运行这个事件因为此时委托已经指向了具体方法可以运行了}private static void c1_myevent(object sender, EventArgs e){//事件处理方法Console.WriteLine( 你触发了事件);}}
}对于这个例子为了加深理解事件的本质我们可以把事件订阅c1.myevent new Class1.mydelegate(c1_myevent); 这句注释掉即事件没有指向任何具体的方法编译不会报错运行它如果我们不输入