13委托和事件

1、委托是什么?

委托是一种数据类型,像类一样(可以声明委托类型变量)。方法参数可以是 int、string、类类型

void M1(int n){ }        √

void M2(string s){ }    √

void M3(Person p){ }    √

那么能不能把方法也作为参数进行传递?

委托就是一种数据类型,用来存放方法的了数据类型

委托的声明方式:delegate 返回值类型 委托的名(参数)

存储什么样的方法就声明什么类型(方法参数与返回值)的委托。

声明的委托是一种类型,就像int、Person一样,如果要用的话还要声明委托类型的变量,声明委托类型的方式:        Mydel f1;

将委托类型变量指向函数 Mydel sp = new Mydel (SayHello) ,这样就可以像调用普通函数一样把 sp 当函数用了。委托可以看作是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向他,函数也可以用委托变量指向它。

和直接调用函数的区别:用委托就可以指向任意函数,哪怕是之前没定义的都可以,而不适用受限于那几种。

将委托类型变量指向函数还可以简化成  Mydel sp = SayHello ,编译器帮我们进行了  new  。但是不能 sp = PrintIt() ,因为这样就成了函数调用;

2、匿名方法

1、使用 Delegate 的时候很多时候没必要使用一个普通的方法,因为这个方法只有 Delegate 会用,并且只用一次,这是使用匿名方法最合适

2、匿名方法就死没有名字的方法。(整数 3 就是没有名字的 int 对象。3+5 就是两个匿名 int 对象的相加,允许匿名对象,就允许匿名方法)

ProcessWordDelegate p = delegate(string s) { Console.WriteLine( string s ); };

匿名方法与 lambda 表达式最终编译为一个方法

3、多播委托
  1. 委托绑定多个方法后,其中一个方法执行发生异常,后面的方法不会继续执行
  2. 组合的委托必须是同一个类型
  3. 相当于创建了一个按照组合顺序一次调用的新委托对象
  4. 委托的组合一般是给事件用的,用普通的委托的时候很少用
4、事件(通过委托实现的,委托才是事件正常执行的核心内容)

事件语法:        event ProcessWordDelegate

加了event关键字实现事件机制的好处:用了event事件,不可以修改事件已经注册的值;不可以冒充进行事件通知了。

5、委托和事件的区别

委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为第委托变量的封装。)

下面说的是委托的对象(用委托方式实现的事件) 和 (标准的 event 方式实现) 事件的区别。

事件的内部是用委托实现的。

对于事件来说,外部只能  “注册自己 +=   、  注销自己 -=“ ,外界不可以注销其它的注册者,外界不可以主动触发事件,因为如果用Delegate就没法进行上面的控制,因此但是了事件这种语法。  add、remove

事件是用来阉割委托实例的。事件只能 add 、 remove 自己,不能赋值。

事件只能 += 、-= ,不能 = 、不能外部触发事件

6、委托与事件总结

委托的作用:

占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为 null。

事件的作用:

事件的作用与委托一样,只是功能上比委托变量有更多的限制。

比如:

1、只能通过 += 或 -= 来绑定方法(事件处理程序)

2、只能在类内部调用(触发)事件

在自定义控件(自己编写控件的时候,会大量用到。编写控件的时候,会写一些事件。但是当这些事件被触发以后,具体执行的那些事件处理程序是编写控件的人没法确定的。这个时候只能通过事件来占位(调用),个体调用的是哪个方法,由使用控件的人来决定(Click+=new  委托(方法名);))

来自为知笔记(Wiz)

时间: 2024-07-30 04:32:22

13委托和事件的相关文章

C#学习(一):委托和事件

预备知识 在学习委托和事件之前,我们需要知道的是,很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知. 而发布者/订阅者模式可以满足这种需求.简单来说,在这种模式中,发布者定义了一系列程序的其他部分可能感兴趣的事件.其他类可以"注册",以便再这些事件发生时发布者可以通知它们.这些订阅者类通过向发布者提供一个方法来"注册"以获取通知.当事件发生时,发布者"触发事件",然后执行订阅者提交的所有事件.

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#委托和事件定义和使用

委托 定义委托的语法和定义方法比较相似,只是比方法多了一个关键字delegate ,我们都知道方法就是将类型参数化,所谓的类型参数化就是说该方法接受一个参数,而该参数是某种类型的参数,比如int.string等等:而委托是将方 法参数化,说了上面的那个类型参数化之后,相信你也能猜到方法参数化的意思了,对,就是将方法作为一个参数传到一个委托中. 首先来看看声明委托的语句: public deletate void MyDelegate(); public:访问修饰符  delegate:关键字 

[转载]C#深入分析委托与事件

原文出处: 作者:风尘浪子 原文链接:http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 同类链接:http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html 引言 本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Deleg

C#综合揭秘——深入分析委托与事件

本篇文章将为你介绍一下 Delegate 的使用方式,逐渐揭开 C# 当中事件(Event)的由来,它能使处理委托类型的过程变得更加简单.还将为您解释委托的协变与逆变,以及如何使用 Delegate 使 Observer(观察者)模式的使用变得更加简单.在事件的介绍上,会讲述事件的使用方式,并以ASP.NET的用户控件为例子,介绍一下自定义事件的使用.最后一节,将介绍Predicate<T>.Action<T>.Func<T,TResult>多种泛型委托的使用和Lamb

委托与事件——委托

C#中的委托与事件是很重要的概念,要学好C#,必须冲破这一关. 1.委托 关键字delegate,委托,它与类.枚举.结构.接口一样,也是一种类型. 由于委托是代表了一类具有相同参数列表和返回值的函数,委托定义的变量用于保存具有相同签名的函数实体,它可以指代任何函数.所以,我们说类是对象的抽象,那么委托就可以看成是函数的抽象. 委托的好处: 1.将方法动态地赋给参数,可以避免在程序中大量使用if-else(switch-case)语句,使程序具有良好的可扩展性. 2.可以把函数本身的处理逻辑抽象

C#委托和事件详解

委托Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".它所实现的功能与C/C++中的函数指针十分相似.它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比,delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优点.首先,函数指针只

转:委托和事件详解

Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".它所实现的功能与C/C++中的函数指针十分相似.它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比,delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优点.首先,函数指针只能指

委托与事件——事件

上接”委托与事件——委托“,为了维护程序的封装性,事件不得不出场. 关键字event,用来声明事件对象,允许一个类或对象提供通知的成员,他必须是委托类型. 事件是类和对象向外界发出的消息,事件的执行是通过事件委托的方式,事件的类型是委托类型.调用我们所准备好的处理方法,要响应某些事件并针对某些事件执行我们指定的方法,需要做到以下几步: 1.声明事件委托. 2.声明事件.—————————怎么声明事件 3.添加事件的触发方法.——————这个事件在什么情况下会被触发 4.添加事件的处理程序(响应事