如何理解事件和委托

如何理解事件和委托

public delegate void myDelegate(string str);

public static void HellowChinese(string strChinese)

{

Console.WriteLine("Good morning," + strChinese);

Console.ReadLine();

}

myDelegate d = new myDelegate(HellowChinese);

d("Mr wang");

二、你如何理解事件

如果我们不理解事件,那我们应该理解类中的字段和属性,那我们就从字段和属性角度来理解事件

我们都知道对类中属性的赋值和取值就是调用get和set方法对字段进行操作,同样订阅和取消订阅一个事件时和属性的情况一样,实际是在调用add和remove方法,我们是对过+=和-=运算符使用委托类型的字段。

“事件”存在的的理由和“属性”差不多,它们添加了一个封装层,实现发布、订阅模式。通常,我们不希望其它代码随意更改一个事件的处理程序,当然类能通过添加方法的方式来提供额外的访问。

声明一个事件后编译器会将声明转换成一个具有默认add\remove实现的事件和一个私有委托类型的字段,类内的代码能看见字段,类外的代码只能看见事件。

这样一来,表面上似乎能调用一个事件,,实际上是调用存储在字段中的委托实例。

也就是说事件不是委托实例,它只是成对的add/remove方法,类似于属性的取值和赋值方法。

下面是事件的使用:

using System;using System.Collections.Generic;using System.Linq;using System.Text;

namespace Example_EventTest{ class Judgment { //定义一个委托 public delegate void delegateRun(); //定义一个事件 public event delegateRun eventRun; //引发事件的方法 public void Begin() { eventRun();//被引发的事件 } } class RunSports { //定义事件处理方法 public void Run() { Console.WriteLine("运动员开始比赛"); } } class Program { static void Main(string[] args) { RunSports runsport = new RunSports();//实例化事件发布者 Judgment judgment = new Judgment();//实例化事件订阅者 //订阅事件 judgment.eventRun+=new Judgment.delegateRun(runsport.Run); //引发事件 judgment.Begin(); Console.ReadKey(); } }}

相关手记

六的单词怎么写英语
Ning Xiaozhi
MATLAB中如何输入特殊符号