ASP.NET深入浅出系列4- 也谈委托和事件

简介:

这个话题已经很多人谈过了,本不想重复拿出来说,但为了这个系列的完整性,我便把自己以前积累的东西整理了一下,大家全当消遣了。

作者:方明

一、委托的定义:
《高级汉语大词典》中是如下解释的:托付给别的人或机构办理。要说生活中的意思其实大家都能理解,无非是“当某人(机构)需要完成一件自己不能或不应该完成的事情的时候,此人(机构)物色一个合适的且有能力完成此事的人选,然后提供必要的信息,将此事委托给物色到的人(机构)来完成。” C#中的委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样具有参数和返回值。委托对象能被传递给调用该方法引用的代码而无须知道哪个方法将在编译时被调用。委托是函数的封装,它代表一“类”函数。他们都符合一定的签名:拥有相同的参数列表、返回值类型。同时委托也可以看作是对函数的抽象,是函数的“类”。此时,委托实例代表一个具体的函数。委托应该和类同属一个层面,使用起来也很象一个类。我们先来看一个委托使用的实例:

Code

 

得到的结果为
Hello World!
myHandler==null

 

二、委托的特点
1、一个委托对象可以搭载多个方法。
2、一个委托对象搭载的方法并不需要属于同一个类,但所搭载的方法必须具有相同的原形和形式。
3、委托的实例将代表一个具体的函数

 

三、为什么要使用委托
1、更加灵活的方法调用。我们先举一个例子:

Code

 

这个例子中客户端会根据不同的情况对文件进行备份

2、用于异步回调
由于实例化委托是一个对象,所以可以将其作为参数进行传递,也可以将其赋值给属性。这样方法就可以将一个委托作为参数来接受,并且以后可以调用该委托。这称为异步回调,是在较长的进程完成后用来通知调用方的常用方法,以这种方式使用委托时,使用委托的代码无需了解有关使用方法的实现方面的任何信息。
我们假设这样一个场景,我们希望有这样一个函数,对一个整型数组进行过滤,而过滤得条件在编写函数时还不知道,直到使用这个函数的时候可以根据当前的情况编写过滤条件函数,我们使用委托实现如下:

Code

 

结果为:

1
3
5
7
9

 3、多线程编程中使用委托来指定启动一个线程时调用的方法

Code

 

4、C#中的事件模型。用他们指明处理给定事件的方法。
下面我们详细来介绍事件。
四、事件
事件允许类型(或者类型的实例)在某些特定事情发生的时候通知其他对象。
例如button类定义了一个名为click的事件,当buton对象被点击时,应用程序中的一些对象可能希望能够收到一个通知,并执行一些动作。但问题是当我们编写button类的时候并不知道到底要做什么,到底要调用哪些方法,我们只要在使用button的场景才知道到底应该在按下button时做些什么,基于这样的情况,我们想起了委托,我们先在button类中定义一个委托,然后在使用button的相应场景注册这个委托即可,似乎用委托就解决了这个问题了,那事件还有什么用呢,也就是说委托和事件的区别在哪里呢,其实事件就是一种特殊的委托,使用事件委托的类型,必须使用+=进行注册而不能用=,这样做的原因是事件中已经注册的方法不希望被新注册的方法覆盖掉。微软为使用事件定义了一个模式。
事件模式由以下五步组成:
1、定义一个类型用于保存所有需要发送给事件通知接受者的附加信息(继承于System.EventArgs)
2、定义一个委托类型,用于指定事件触发时被调用的方法类型
3、定义一个事件成员
4、定义一个受保护的虚方法,负责通知事件的登记对象
5、定义一个方法,将输入转化为期望的事件
我们这里举一个发Email的时候触发事件的例子:

Code

 

ps:使用EventHandler<(Of <(TEventArgs>)>) 泛型委托 实现事件(来自msdn)

Code

  这个话题已经很多人谈过了,本不想重复拿出来说,但为了这个系列的完整性,我便把自己以前积累的东西整理了一下,大家全当消遣了。

作者:方明

一、委托的定义:
《高级汉语大词典》中是如下解释的:托付给别的人或机构办理。要说生活中的意思其实大家都能理解,无非是“当某人(机构)需要完成一件自己不能或不应该完成的事情的时候,此人(机构)物色一个合适的且有能力完成此事的人选,然后提供必要的信息,将此事委托给物色到的人(机构)来完成。” C#中的委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样具有参数和返回值。委托对象能被传递给调用该方法引用的代码而无须知道哪个方法将在编译时被调用。委托是函数的封装,它代表一“类”函数。他们都符合一定的签名:拥有相同的参数列表、返回值类型。同时委托也可以看作是对函数的抽象,是函数的“类”。此时,委托实例代表一个具体的函数。委托应该和类同属一个层面,使用起来也很象一个类。我们先来看一个委托使用的实例:

Code

 

得到的结果为
Hello World!
myHandler==null

 

二、委托的特点
1、一个委托对象可以搭载多个方法。
2、一个委托对象搭载的方法并不需要属于同一个类,但所搭载的方法必须具有相同的原形和形式。
3、委托的实例将代表一个具体的函数

 

三、为什么要使用委托
1、更加灵活的方法调用。我们先举一个例子:

Code

 

这个例子中客户端会根据不同的情况对文件进行备份

2、用于异步回调
由于实例化委托是一个对象,所以可以将其作为参数进行传递,也可以将其赋值给属性。这样方法就可以将一个委托作为参数来接受,并且以后可以调用该委托。这称为异步回调,是在较长的进程完成后用来通知调用方的常用方法,以这种方式使用委托时,使用委托的代码无需了解有关使用方法的实现方面的任何信息。
我们假设这样一个场景,我们希望有这样一个函数,对一个整型数组进行过滤,而过滤得条件在编写函数时还不知道,直到使用这个函数的时候可以根据当前的情况编写过滤条件函数,我们使用委托实现如下:

Code

 

结果为:

1
3
5
7
9

 3、多线程编程中使用委托来指定启动一个线程时调用的方法

Code

 

4、C#中的事件模型。用他们指明处理给定事件的方法。
下面我们详细来介绍事件。
四、事件
事件允许类型(或者类型的实例)在某些特定事情发生的时候通知其他对象。
例如button类定义了一个名为click的事件,当buton对象被点击时,应用程序中的一些对象可能希望能够收到一个通知,并执行一些动作。但问题是当我们编写button类的时候并不知道到底要做什么,到底要调用哪些方法,我们只要在使用button的场景才知道到底应该在按下button时做些什么,基于这样的情况,我们想起了委托,我们先在button类中定义一个委托,然后在使用button的相应场景注册这个委托即可,似乎用委托就解决了这个问题了,那事件还有什么用呢,也就是说委托和事件的区别在哪里呢,其实事件就是一种特殊的委托,使用事件委托的类型,必须使用+=进行注册而不能用=,这样做的原因是事件中已经注册的方法不希望被新注册的方法覆盖掉。微软为使用事件定义了一个模式。
事件模式由以下五步组成:
1、定义一个类型用于保存所有需要发送给事件通知接受者的附加信息(继承于System.EventArgs)
2、定义一个委托类型,用于指定事件触发时被调用的方法类型
3、定义一个事件成员
4、定义一个受保护的虚方法,负责通知事件的登记对象
5、定义一个方法,将输入转化为期望的事件
我们这里举一个发Email的时候触发事件的例子:

Code

 

ps:使用EventHandler<(Of <(TEventArgs>)>) 泛型委托 实现事件(来自msdn)

Code

本文转自 你听海是不是在笑 博客园博客,原文链接:http://www.cnblogs.com/nuaalfm/archive/2008/09/15/1291291.html  ,如需转载请自行联系原作者
相关文章
|
6月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
346 2
|
C++
【.Net】使用委托实现被引用的项目向上级项目的消息传递事件
在实际项目过程中,经常可能遇到被引用的项目要向上传递消息,但是又不能通过方法进行返回等操作,这个时候委托就派上用场了。以下使用委托,来实现被引用的项目向上传递消息的小教程,欢迎各位大佬提供建议。1、新增控制台项目(一般在CS架构中会用的比较多,用于跨线程传递消息使用)。此处用一个控制台项目来模拟演示使用委托进行消息事件的传递教程。
100 0
【.Net】使用委托实现被引用的项目向上级项目的消息传递事件
|
物联网 网络性能优化
阿里云物联网NET Core 客户端 CZGL.AliloTClient:9.自定义 委托事件方法
阿里云物联网NET Core 客户端 CZGL.AliloTClient:9.自定义 委托事件方法
256 15
|
物联网 网络性能优化 开发工具
.NET Core 跨平台物联网网开发:设置委托事件(二)
.NET Core 跨平台物联网网开发:设置委托事件(二)
284 0
.NET Core 跨平台物联网网开发:设置委托事件(二)
|
JSON 物联网 网络性能优化
NET Core 跨平台物联网开发 SDK属性、方法、委托、类(四)
NET Core 跨平台物联网开发 SDK属性、方法、委托、类(四)
279 0
|
物联网 网络性能优化
阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:9. 自定义委托事件方法
CZGL.AliIoTClient 有7个委托事件,设置了默认的方法。你可以通过下面的方法使用默认的方法绑定到委托事件中。 public void UseDefaultEventHandler() 1)默认的方法 收到服务器下发属性设置时: public void Default_PubPrope...
4067 0
|
物联网 网络性能优化
阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:8. 委托事件
CZGL.AliIoTClient 里设置了 7 个委托事件,在程序的不不同生命周期触发。 1)7个委托事件 /// <summary> /// 服务器属性设置 /// </summary> public PublishPropert...
978 0
|
.NET API 开发框架
ASP.NET Core中实现单体程序的事件发布/订阅
ASP.NET Core中实现单体程序的事件发布/订阅 背景# 事件发布/订阅是一种非常强大的模式,它可以帮助业务组件间实现完全解耦,不同的业务组件只依赖事件,只关注哪些事件是需要自己处理的,而不用关注谁来处理自己发布事件,事件追溯(Event Sourcing)也是基于事件发布/订阅的。
1601 0
【原创】.Net使用委托讲解-入门
原文地址:【原创】.Net使用委托讲解-入门 什么是委托? 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
1248 0