手机
当前位置:查字典教程网 >编程开发 >C#教程 >C#中委托和事件的区别实例解析
C#中委托和事件的区别实例解析
摘要:本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用。具体如下:大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件...

本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用。具体如下:

大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。本篇分别通过委托和事件执行多个方法,从中体会两者的区别。

一、通过委托执行方法

class Program { static void Main(string[] args) { Example example = new Example(); example.Go(); Console.ReadKey(); } } public class Example { public delegate void DoSth(string str); internal void Go() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSth d = new DoSth(Print); string str = "Hello,World"; //通过委托的静态方法Invoke触发委托 d.Invoke(str); } void Print(string str) { Console.WriteLine(str); } }

上述代码实现:

① 在CLR运行时,委托DoSth实际上就一个类,该类有一个参数类型为方法的构造函数,并且提供了一个Invoke实例方法,用来触发委托的执行。

② 委托DoSth定义了方法的参数和返回类型

③ 通过委托DoSth的构造函数,可以把符合定义的方法赋值给委托

④ 调用委托的实例方法Invoke执行了方法

但实际上让委托执行方法还有另外一种方式,那就是:委托变量(参数列表)

public class Example { public delegate void DoSth(object sender, EventArgs e); internal void Go() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSth d = new DoSth(Print); object sender = 10; EventArgs e = new EventArgs(); d(sender, e); } void Print(object sender, EventArgs e) { Console.WriteLine(sender); } }

上述代码实现:

① 委托DoSth的参数列表和方法Print的参数列表还是保持一致

② 委托DoSth中的参数object sender通常用来表示动作的发起者,EventArgs e用来表示动作所带的参数。

而实际上,委托变量(参数列表),事件就是采用这种形式执行方法的。

二、通过事件执行方法

public class Example { public delegate void DoSth(object sender, EventArgs e); public event DoSth myDoSth; internal void Go() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSth d = new DoSth(Print); object sender = 10; EventArgs e = new EventArgs(); myDoSth += new DoSth(d); myDoSth(sender, e); } void Print(object sender, EventArgs e) { Console.WriteLine(sender); } }

上述代码实现:

① 声明了事件myDoSth,事件的类型是DoSth这个委托

② 通过+=为事件注册委托

③ 通过DoSth委托的构造函数为事件注册委托实例

④ 采用委托变量(参数列表)这种形式,让事件执行方法

而且,通过+=还可以为事件注册多个委托。

public class Example { public delegate void DoSth(object sender, EventArgs e); public event DoSth myDoSth; internal void Go() { //声明一个委托变量,并把已知方法作为其构造函数的参数 DoSth d = new DoSth(Print); DoSth d1 = new DoSth(Say); object sender = 10; EventArgs e = new EventArgs(); //为事件注册多个委托 myDoSth += new DoSth(d); myDoSth += new DoSth(d1); myDoSth(sender, e); } void Print(object sender, EventArgs e) { Console.WriteLine(sender); } void Say(object sender, EventArgs e) { Console.WriteLine(sender); } }

以上,通过+=为事件注册1个或多个委托实例,实际上,还可以为事件直接注册方法。

public class Example { public delegate void DoSth(object sender, EventArgs e); public event DoSth myDoSth; internal void Go() { object sender = 10; EventArgs e = new EventArgs(); //为事件注册多个委托 myDoSth += Print; myDoSth += Say; myDoSth(sender, e); } void Print(object sender, EventArgs e) { Console.WriteLine(sender); } void Say(object sender, EventArgs e) { Console.WriteLine(sender); } }

三、通过EventHandler执行方法

先来看EventHandler的源代码。

public delegate void EventHandler(object sender, System.EventArgs e);

可见,EventHandler就是委托。现在就使用EventHandler来执行多个方法。

public class Example { public event EventHandler myEvent; internal void Go() { object sender = 10; EventArgs e = new EventArgs(); //为事件注册多个委托 myEvent += Print; myEvent += Say; myEvent(sender, e); } void Print(object sender, EventArgs e) { Console.WriteLine(sender); } void Say(object sender, EventArgs e) { Console.WriteLine(sender); } }

总结:

① 委托就是一个类,也可以实例化,通过委托的构造函数来把方法赋值给委托实例

② 触发委托有2种方式: 委托实例.Invoke(参数列表),委托实例(参数列表)

③ 事件可以看作是一个委托类型的变量

④ 通过+=为事件注册多个委托实例或多个方法

⑤ 通过-=为事件注销多个委托实例或多个方法

⑥ EventHandler就是一个委托

相信本文所述对大家C#程序设计的学习有一定的借鉴价值。

【C#中委托和事件的区别实例解析】相关文章:

C#中读写INI文件的方法例子

基于C#委托的深入分析

C#计算两个文件的相对目录算法的实例代码

C# 委托(跨窗体操作控件)实例流程讲解

ref 和out传参的区别分析

c#解压文件的实例方法

C#委托初级使用的实例代码

c# 引用类型与值类型的区别详解

ref与out之间的区别深入解析

深入c# 类和结构的区别总结详解

精品推荐
分类导航