广州住房保障城市建设局网站,网站建设kpi考核,网络营销推广策划方案范文,wordpress文章点开是个新网页转自#xff1a;http://ruizhinet.blog.163.com/blog/static/9921382820092801032681/ 之前写过一篇关于C#委托与事件的文章#xff08;见《C#委托和事件例析》#xff09;#xff0c;不过还是收到一些网友的提问。所以#xff0c;今天再换另一个角度来详解一下这个问题。…转自http://ruizhinet.blog.163.com/blog/static/9921382820092801032681/ 之前写过一篇关于C#委托与事件的文章见《C#委托和事件例析》不过还是收到一些网友的提问。所以今天再换另一个角度来详解一下这个问题。 一、在控制台下使用委托和事件 我们都知道C#中有“接口”这个概念所谓的“接口”就是定义一套标准然后由实现类来具体实现其中的方法所以说“接口是一组类的抽象”。同样道理我们可以将“委托”理解为“方法的抽象”也就是说定义一个方法的模板至于这个方法具体是怎么样的就由方法自己去实现。 我们知道接口的最大好处就是可以实现多态同理“委托”是可以实现方法的多态当我们想调用某个具体方法的时候我们不直接调用这个方法而是去调用这个委托。当然我们必须在具体方法和委托之间建立某种关联。 下面我们来看例子。 首先我们定义一个委托 public delegate void SaySomething(string name); 这跟抽象方法的语法格式很相似只是多了一个关键字delegate。既然是对方法的一种抽象那么我们最关注的当然就是方法的返回值以及方法的参数了。所以上面红色的部分就是我们定义出来的一个规矩如果某个方法想委托我去做事那么请你遵循我的规矩就是返回值为void参数为一个字符串。我们这个委托的含义是当某个人来了就向他说点东西。 好既然我们已经定义了这个规矩下面我们就定义具体的方法了。 public void SayHello(string name){ Console.WriteLine(Hello, name !);} public void SayNiceToMeetYou(string name){ Console.WriteLine(Nice to meet you, name !);} 我们这里一共定义了两个方法一个是向某人说Hello另一个是向某人说Nice to meet you。我们看到这里定义的两个方法的返回值和参数跟我们前面定义的“委托”是一致的。 接下来我们来看事件。 public event SaySomething come; 我们定义了一个事件这个事件是“有人来了”注意定义的时候我们使用event关键字除此之外我们还加上了前面定义的“委托”的名字。这个意思是说我这个事件只会跟“SaySomething”打交道并且当我这个事件发生的时候我会通知关注我的这些“委托”再由这些“委托”去调用具体的方法。 我们来定义一个测试方法 public void test() { SaySomething sayhello new SaySomething(SayHello); SaySomething saynice new SaySomething(SayNiceToMeetYou); come sayhello; come saynice; come(张三);} 方法体中的前面两行是用来实例化委托注意我们用到了new关键字就好像实例化一个类一样然后传入一个参数但这个参数不是string类型、也不是int类型而是一个方法名。 再下面两行就是将委托加到事件上意思是说如果你这个事件发生了就告诉我一声。可以通过“”来将n个委托实例加到某个事件上一旦这个事件发生所有的这些委托实例都会得到通知。 最后一行是触发一个事件注意我们是直接用一个事件名然后跟一个参数这又跟“委托”中定义的那个规矩一致即要有一个string类型的参数。 最后运行一下 static void Main(string[] args){ Program program new Program(); program.test(); Console.Read();} 我们回过头来再看一下“事件”的定义 public event SaySomething come; 这里已经指出了“委托”的名字所以我们可以直接将方法加到事件上而省略“委托”的实例化过程因此上面的test()方法可以简单写为 public void test() { come SayHello; come SayNiceToMeetYou; come(张三);} 二、在窗体中使用委托和事件 上面的例子并不能体现委托和事件的优点其实委托和事件在C#中使用非常广泛例如当我们点击某个“按钮”的时候就会有一个“Click”事件触发而这个事件会通知“委托”在C#窗体应用程序中“委托”的名字比较规范统一使用“EventHandler”它的具体格式是“void EventHandler(object sender, EventArgs e);”。相信大家都写过下面这样子的HelloWorld程序 当点击按钮的时候弹出一个对话框。我们怎样实现的呢你肯定会说我们在设计窗口双击按钮就会自动为我们生成类似如下的方法 private void button1_Click(object sender, EventArgs e){ MessageBox.Show(我被点击了);} 其实这里用到的就是事件和委托这里的button1_Click就是符合EventHandler委托规矩的一个具体的方法即返回值为void参数分别是一个object和EventArgs。 我们可以在Form1.Designer.cs中看到如下代码 this.button1.Click new System.EventHandler(this.button1_Click); 可以看到这里有一个Click事件然后将一个委托实例附加到这个事件上跟我们前面讲的控制台应用程序中的用法是完全一样的。那这个Click事件是怎么触发的呢对于这些系统类的事件并不用我们管。 当然我们也可以定义自己的事件和委托例如我定义一个事件这个事件就是输出对象的名字。 我们这里定义了一个ShowName委托和一个btnclick事件。并且在button1_Click()方法中触发这个btnclick事件。最后的结果是当我们点击按钮的时候首先弹出一个“我被点击了”的对话框然后确定之后再弹出另一个显示按钮名称的对话框 转载于:https://www.cnblogs.com/bianlan/archive/2013/01/18/2867114.html