在.NET时代,函数指针有了更安全更优雅的包装,就是委托。而事件,则是为了限制委托灵活性引入的新“委托”(之所以为什么限制,后面会谈到)。同样,熟练掌握委托和事件,也是C#登堂入室的标志。...事件和委托这么好,可是当你写了很多代码,完成大型系统时,心里是不是总觉得怪怪的?有当年使用指针时类似的感觉? ...在多线程环境下,挂接事件时和对象创建所在的线程不同,那事件处理函数中的代码将在哪个线程中执行? 当代码的层次复杂时,开放委托和事件是不是会带来更大的麻烦? ...不妨最后一个问题,“在复杂软件环境下,如何理性正确的使用委托和事件”放在第二部分吧。有些问题我也没搞清,在做实验的情况下,才逐渐接近结论。 写完这篇文章,我深有收获。 ...本文介绍了C#的委托和事件的订阅和取消订阅,并在匿名函数和多线程两个环境下讨论了一些问题。如果你觉得这篇文章对你有帮助,请点一下推荐,若有任何问题,欢迎留言讨论,共同学习。
一:委托简介 委托是一种指针,保持方法的引用 委托使得方法可以作为参数进行传递 如: public delegate void MyDelegate(); class Program...MyDelegate a = SayHellow; a(); Console.ReadKey(); } } 委托其实是一种特殊的类...他定义了方法的签名 使得与该签名相同的方法都能被此委托所引用 有了这个特性就可以把方法当作参数进行传递 二:匿名方法 委托可以不用已存在的方法创建 如 public delegate void...,实例方法和静态方法 三:多播委托 委托支持操作符重载 可以将多个方法绑定到同一个委托 也可以从一个委托移除某一方法 可以把一个方法绑定多次,运行时也会执行多次 如 public delegate...,这些方法是无序的,设计时不要依赖这种顺序 四:事件 可以不用初始化事件就直接用+=操作符绑定方法 观察者模型(此方法JimmyZiYang原创,此处做了适当修改,在此表示感谢) public delegate
C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错...例如:委托类型 委托实例 = new 委托类型(方法名); 欢迎浏览本文的后续文章: C#中的委托和事件(续) 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触...C#时间不长的人来说并不容易。...它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。...本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
14 t.Boiled += new BoiledEventHandler(new Monitor().Display);//在监视对象(热水器)中为观察者(显示器)实例方法事件的注册...15 t.BoilingWater();//Heater类实例对Boiled事件的触发,以便更新观察者(显示器)中的数据 16 Console.ReadKey...(); 17 } 18 } 19 20 class BoiledEventArgs : EventArgs //事件类,存储观察者对监视对象(热水器)所感兴趣的字段(如...} 27 } 28 delegate void BoiledEventHandler(object sender,BoiledEventArgs e); //定义一个委托...感兴趣的字段:温度 32 public string Brand = "Midea"; 33 public event BoiledEventHandler Boiled;//事件委托
Delegate ---- C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。...委托特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。...事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。 订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。...在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。 事件声明 ---- 事件和方法一样具有签名,签名包括名称和参数列表。...事件的签名通过委托类型来定义,然后向类中添加事件需要使用 event 关键字,并提供委托类型和事件名称。
委托 委托类似于C++中的函数指针(一个指向内存位置的指针)。委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。简单理解,委托是一种可以把函数当做参数传递的类型。...自定义委托 声明和执行一个自定义委托,大致可以通过如下步骤完成: 利用关键字delegate声明一个委托类型,它必须具有和你想要传递的方法具有相同的参数和返回值类型; 创建委托对象,并且将你想要传递的方法作为参数传递给委托对象...; } } 可以看出,多播委托的声明过程是和自定义委托一样的,可以理解为,多播委托就是自定义委托在实例化时通过 “+=” 符号多绑定了两个方法。...事件 委托是一种类型,事件依赖于委托,故事件可以理解为是委托的一种特殊实例。它和普通的委托实例有什么区别呢?委托可以在任意位置定义和调用,但是事件只能定义在类的内部,只允许在当前类中调用。...我们看到PlayOverEvent事件内部生成了两个方法:add_ PlayOverEvent和remove_ PlayOverEvent。
一、事件 事件阶段 一般的,事件分为三个阶段:捕获阶段、目标阶段和冒泡阶段。 (1)捕获阶段(Capture Phase) 事件的第一个阶段是捕获阶段。事件从文档的根节点流向目标对象节点。...它将我们从对特定元素的事件监听中释放出来,如果没有事件冒泡,我们需要监听很多不同的元素来确保捕获到想要的事件。 事件委托 事件委托是一种由其它元素而非事件目标元素来响应事件产生的行为的思想。...通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。...有多种方法来处理事件委托。标准方法来源于原生浏览器的功能。浏览器以一种特定的工作流程来处理事件,并支持事件捕获和事件冒泡。...W3C关于浏览器怎么支持事件的文档:W3C DOM Level 3 Events。一些JS库和框架公开了其它方式,如发布/订阅模型(将在后文提及)。
我们继续思考上面的程序:上面的三个方法都定义在Programe类中,这样做是为了理解的方便,实际应用中,通常都是 GreetPeople 在一个类中,ChineseGreeting和 EnglishGreeting...现在你已经对委托有了初步了解,是时候对上面的例子做个改进了。...程序一如预料地那样输出了: Morning, Jimmy Zhang 早上好, 张子阳 现在,假设我们需要使用上一节学到的知识,将多个方法绑定到同一个委托变量,该如何做呢?...此时,轮到Event出场了,C# 中可以使用事件来专门完成这项工作,我们改写GreetingManager类,它变成了这个样子: 很容易注意到:MakeGreet 事件的声明与之前委托变量delegate1...看到这里,你差不多明白到:事件其实没什么不好理解的,声明一个事件不过类似于声明一个委托类型的变量而已。
关于什么是委托,委托如何使用,我在这里就不说了。...需要说的: 委托是函数指针链 委托的 BeginInvoke 委托如果出现异常,会如何 如果不知道函数指针,可以继续往下看,我来告诉大家,为何需要委托。...如果委托发生异常 如果委托方法里没有 try catch,那么如果使用 invoke, 委托是函数指针链,所以会在执行异常退出。...{ Console.WriteLine("线程ID为:{0}", Thread.CurrentThread.ManagedThreadId); } 事件...如果事件使用 BeginInvoke 和 委托一样 _event += (s, e) => M1(); _event += (s, e) => M2()
C#中的委托和事件 - Part.2 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识。但那些远不是委托和事件的全部内容,还有很多的地方没有涉及。...在 C#中的委托和事件 中,我提出了两个为什么在类型中使用事件向外部提供方法注册,而不是直接使用委托变量的原因。...2、我们还应该发现,这里采用的、对NumberChanged委托变量的访问模式和C#中的属性是多么类似啊?大家知道,在C#中通常一个属性对应一个类型成员,而在类型的外部对成员的操作全部通过属性来完成。...现在我们来看下如何解决这个问题,先回顾一下之前我在C#中的委托和事件一文中提到的内容,我说过,委托的定义会生成继承自MulticastDelegate的完整的类,其中包含Invoke()、BeginInvoke...总结 这篇文章是对我之前写的C#中的委托和事件的一个补充,大致分为了三个部分,第一部分讲述了几个容易让人产生困惑的问题:为什么使用事件而不是委托变量,为什么通常委托的定义都返回void;第二部分讲述了如何处理异常和超时
/// 什么是事件?...事件是委托的一个实例,如Student的一个实例是张三,并且带有event关键字修饰,事件是一种更安全的特殊委托 46 /// 只能在事件所在的类内部对其赋值和调用(invoke();)...,不能在外部对其赋值和调用,即使是子类。...Console.WriteLine("**********"); 15 } 16 { 17 //使用委托和事件的方式解决该问题...Console.WriteLine("**********"); 24 } 25 { 26 //使用委托和事件的方式解决该问题
今天跟随视频学习了一下C#中最重要的一些概念之委托与事件。...),以及张子阳Jimmy Zhang的博文《C# 中的委托和事件》(地址:http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html...但通过Reflector反编译,可以看出事件其实就是一个封装了的私有的委托而已,还包含两个方法:add和remove;这两个方法分别用于注册委托类型的方法和取消注册。...而这两个方法的访问限制取决于声明事件时的访问限制符。所以,这下客户端只能注册、注销事件,无法进行伪造和清空事件,保证了封装性。...3.委托和事件的区别 委托和事件没有可比性,因为委托是类型,事件是对象。而委托的对象(用委托方式实现的事件)与标准event方式实现的事件的区别是:事件的内部是用委托实现的。
C#中的委托和事件 - Part.1 2007-9-23 作者: 张子阳 分类: C# 语言 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量...例如:委托类型 委托实例 = new 委托类型(方法名); 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。...它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。...本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。...// 省略... .Net Framework中的委托与事件 尽管上面的范例很好地完成了我们想要完成的工作,但是我们不仅疑惑:为什么.Net Framework 中的事件模型和上面的不同?
前言 事件和委托是C#中的高级特性,也是C#中很有意思的一部分。出现事件的地方,必然有委托出现;而委托则不一定会有事件出现。那为什么会出现这样的关系呢?...这就需要从事件和委托的定义出发,了解其中的内在。 ? 1. 委托 说起委托,就不得不回忆一下之前在Linq篇中介绍的匿名方法,其中提到了Func和Action这两个类型。这两个类型就是委托。...中委托支持多路广播,所以也可以使用+、-进行注册和删除。...多路广播是指在事件和委托中有多个监听器或响应方法,当事件触发或者委托调用的时候,注册的方法组将会都调用。...到这里,委托和事件的基本概念就已经介绍完毕了,当然还是那句话,更多的内容在实践中。C#的事件机制让程序员有更多的自由去自定义事件,而不是被局限在某些框架内。
当涉及到C#中的委托和事件,面试中可能会出现一些常见的问题。这里有几个可能会被问到的问题以及相应的答案。先列出问题大家尝试答一下,再看后面的答案。 试题 1、委托(Delegate)是什么?...2、什么是多播委托(Multicast Delegate)? 3、委托和接口有什么区别? 4、什么是事件? 5、事件和委托之间有何关系? 6、什么是事件处理器(Event Handler)?...使用 event 关键字定义事件,语法如下: public event EventHandler MyEvent; 5、事件和委托之间有何关系? 答案: 事件是委托的一种使用方式。...答案: 事件处理器是一个方法,它用于响应事件的发生。事件发生时,事件处理器被调用执行相应的逻辑。 7、委托和Lambda表达式之间的关系是什么?...可重用性:可以在不同的上下文中多次使用相同的委托。 解耦:可以实现低耦合,使得代码更易于维护和理解。 结语 准备这些问题的答案并理解它们可以帮助你在面试中更自信地讨论C#中委托和事件的概念。
在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的 C#类库中自带了一大堆事件,尤其那些控件。...所以下面就开始着重讲讲自定义事件的问题: 事件是类和对象向外界发出的消息,事件的执行是通过事件委托的方式,调用我们所准备好的处理方法。...要响应某些事件并针对某些事件执行我们指定的方法,需要做到以下几步: 声明委托、事件 ///定义一个委托 public delegate void TestEventHandler...,他与声明事件的delegate具有相同的参数和返回值类型 public void KeyPressed(object sender, TestEventSource.TestEventArgs...public class TestEventListener { //定义本地处理事件的方法,他与声明事件的delegate具有相同的参数和返回值类型
前天接了个电话面试,被问到事件与委托的区别,虽然一直用但真要你说有什么区别一时半会还真说不上来。...于是问google老师,得到如下答案: 1.事件的声明只是在委托前面加一个event关键词,虽然你可以定义一个public,但是有了event关键词后编译器始终会把这个委托声明为private,然后添加...这样就导致事件只能用+=,-=来绑定方法或者取消绑定方法。而委托可以用=来赋值,当然委托也是可以用+=,-=来绑定方法的(面试我的那个哥们好像说不行)。 ...2.委托可以在外部被其他对象调用,而且可以有返回值(返回最后一个注册方法的返回值)。而事件不可以在外部调用,只能在声明事件的类内部被调用。我们可以使用这个特性来实现观察者模式。大概就是这么多。...t.doEventSay("eventSay");//正确 事件只能在声明的内部调用 string str = t.deleSay("deleSay")
事件委托也称事件代理,在jQuery里面就称为事件委派。 事件委托就是把事件监听放在祖先元素(如父元素、爷爷元素)上。...由于事件会在冒泡阶段向上传播到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件。这种方法叫做事件的代理。...事件委托的原理 不是给每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利事件用冒泡的原理影响设置每个子节点 事件委托作用 绑定事件越多,浏览器内存占用越大,严重影响性能 只操作一次DOM...事件委托实现 dianwo dianwo dianwo dianwo dianwo...image.png 事件委托的优点: 1.减少事件注册,节省内存。 在table上代理所有td的click事件。 在ul上代理所有li的click事件。 2.可以监听动态生成的元素。
前言: C#委托是什么 c#中的委托可以理解为函数的一个包装, 它使得C#中的函数可以作为参数来被传递, 这在作用上相当于C++中的函数指针....event (1) 事件时委托的封装,可以理解为一种特殊的委托。...(2) 事件里面其实就两个方法(即add_event() 和 remove_event())和一个私有的委托变量,这两个方法里面分别是对这个私有的委托变量进 行的合并和移除,当调用事件的+=时其实是调用的事件里的...add_event()方法,同样-=调用的是remove_event()方法 (3) 事件只能够从对象外部增加新的响应方法和删除已知的响应方法,而不能主动去触发事件和获取其他注册的响应方法等信息。...如果使用 公有的delegate则不能做这些限制,也就是说事件对委托做了限制,使委托使用起来更加方便。 也有人说事件是对委托的阉割,大概也是这个意思。
在上一篇看到他我一下子就悟了---委托,被人狂喷。说写的太空,没有什么内容之类的。所以准备在这里重写下,不过还是按着以前的方式尽量简单的写。这里我们以打篮球为例。...第二步:触发事件 当球被发出时,此时发球员对象产生一个新事件。 第三步:球产生一个事件 创建一个新事件,这个事件还有一些参数,如球的距离和轨迹。...事件处 理程序就是产生事件时订购者对象运行的方法,一旦发球者产生了其事件,就会创建一个BallEventArgs对象,其中包含球的轨迹 和距离,从而将个对象传递到订购者的事件处理程序。...声明如下: public event EventHandler Play; event关键字后面的EventHandler不是C#的保留字,它是.NET提供的。...void sendPlayer_Play(object sender,EventArgs e) C#中并没有规则要求事件处理程序必须按某种方式命名,不过这是一种非常标准的命名约定:首先是对象引用名,
领取专属 10元无门槛券
手把手带您无忧上云