C#中委托和事件的区别实例解析

这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下

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

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

一、通过委托执行方法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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执行了方法

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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用来表示动作所带的参数。

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

二、通过事件执行方法


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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委托的构造函数为事件注册委托实例
④ 采用委托变量(参数列表)这种形式,让事件执行方法

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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个或多个委托实例,实际上,还可以为事件直接注册方法。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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的源代码。


1

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

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

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);

}

}

总结:

① 委托就是一个类,也可以实例化,

时间: 2024-08-25 15:30:18

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

C#中委托和事件的区别

大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. □ 通过委托执行方法 class Program { static void Main(string[] args) { Example example = new Example(); example.Go(); Console.ReadKey(); } } public class Example { pu

c# 委托与事件的区别

委托与事件的区别 委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装.),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别.事件的内部是用委托实现的.(举例子:三种实现事件方式的区别(直接用委托实现.用私有委托+公有方法模拟事件,直接用event事件实现)) 因为对于事件来讲,外部只能“注册自己+=.注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这

c#之委托和事件的区别

下面开始对事件进行介绍 1.定义事件以及事件的编译原理 首先定义事件对应的委托: 1 public delegate void ThreeClickEventDel(); 然后对应事件变量:(其实就是在委托前面加一个event) public event ThreeClickEventDel ThreeClickEvent; 反编译之后:是:一个“私有委托”和两个“公有”的“add”和“remover”方法 1)因为是私有委托:所以只有类的内部可以调用,在类外部就不能被调用.创建的类的实例也是不

c#中委托和事件(转)

C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 将方法作为方法的参

C#中委托和事件

目 录 1.1 理解委托 2 1.1.1 将方法作为方法的参数 2 1.1.2 将方法绑定到委托 4 1.2 事件的由来 6 1.2.1 更好的封装性 6 1.2.2 限制类型能力 9 1.3 委托的编译代码 10 1.4 .NET 框架中的委托和事件 11 1.4.1 范例说明 11 1.4.2 Observer 设计模式简介 12 1.4.3 实现范例的Observer 设计模式 13 1.4.4 .NET 框架中的委托与事件 14 1.5 委托进阶 16 1.5.1 为什么委托定义的返回值

c#中委托和事件(续)(转)

本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器.异常处理.超时处理和异步方法调用等内容. 为什么要使用事件而不是委托变量? 在 C#中的委托和事件 中,我提出了两个为什么在类型中使用事件向外部提供方法注册,而不是直接使用委托变量的原因.主要是从封装性和易用性上去考虑,但是还漏掉了一点,事件应该由事件发布者触发,而不应该由客户端(客户程序)来触发.这句话是什么意思呢?请看下面的范例: NOTE:注意这里术语的变化,当我们单独谈论事件,我们说发布者(publishe

C#一些知识点:委托和事件的区别

在C#中,委托和事件是比较容易混淆的两个知识点,本篇博客就记录一下委托和事件之间的区别. 定义上的区别 委托:委托实际上是一个类,用来表示一个函数,可以理解为C++中的函数指针. 事件:事件是一个修饰符,用来修饰一个委托类型的属性,表示该委托的部分功能被限制了. 我们可以这么理解:委托是类,定义了委托后,就可以像使用类一样的来使用这个委托,而事件修饰了委托后则是表示限制这个委托的部分功能,使其满足作为事件的规则. 那么事件究竟限制了委托的什么功能呢?主要是下面的这两个限制: 调用的限制 委托的调

关于c#中委托与事件的一些理解

文章目的:作者(初学者)在学习c#的过程中,对事件.委托及其中的“object sender,EventArgs e”一直感觉理解不透,因此在网上找了一些资料,学习并整理出了该篇笔记,希望能将自己的心得记录下来作为积累.限于能力且是初学,有错误的地方还请大家批评指正. 注意:该笔记中有部分内容摘自网上的参考资料,并非作者原创,仅限学习交流,特此声明! 一. 委托与事件       委托与事件是一对相互关联的概念.委托是一种引用类型,可通过声明委托变量,并将其初始化为某个匹配的函数来实现对该函数的

C#中委托和事件的理解

看了张子阳博客后,总结了一下个人的理解,原文见:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html 委托是可以把方法作为参数的一种东东. 把委托声明成与方法的返回值和参数一模一样. 然后把方法赋值给委托变量,委托变量就可以作为参数带入函数. 委托最主要的作用是实现C#中的事件. C#中的委托型事件需要遵守几个书写规范: 1.委托名称必须以EventHandler结尾.如:PlayEventHandler 2.委托必须声