C# 事件与委托的区别

C# 事件与委托的区别

先看一段程序

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Test obj = new Test();
  6. obj.print += printout1; //绑定printout1方法
  7. obj.print += printout2; //绑定printout2方法
  8. obj.start();
  9. }
  10. static void printout1()
  11. {
  12. Console.WriteLine("输出第一段字符串");
  13. }
  14. static void printout2()
  15. {
  16. Console.WriteLine("输出第二段字符串");
  17. }
  18. }
  19. public delegate void Print(); //创建委托
  20. class Test
  21. {
  22. public event Print print; //创建事件实例
  23. public void start()
  24. {
  25. print(); //触发事件
  26. }
  27. }

上面的代码使用的是标准的事件委托格式,现在我将其中的event关键字去掉,你会发现程序依然可以正常的运行,不会出现任何的问题。


事件实际上是一个特殊的委托实例,不用事件也没有关系。实际上事件只是削弱了委托的功能,event在编译器角度保护了你程序的安全,因为你只能使用+=、-= 来注册事件了,而不能使用 = 为事件关联方法。(在委托中还可以使用=来绑定方法,不过=是一种破坏性代码,不管之前是否已经绑定的有方法了,他都会将其清除)

例子:将上面的代码为事件绑定方法的部分中的 += 换成 = 编译器就会报错

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Test obj = new Test();
  6. obj.print = printout1; //绑定printout1方法时出错
  7. obj.start(); //事件不能使用等号运算符绑定方法
  8. }
  9. static void printout1()
  10. {
  11. Console.WriteLine("输出第一段字符串");
  12. }
  13. }
  14. public delegate void Print(); //创建委托
  15. class Test
  16. {
  17. public event Print print; //创建事件实例
  18. public void start()
  19. {
  20. print(); //触发事件
  21. }
  22. }

错误提示
时间: 2024-10-19 11:20:50

C# 事件与委托的区别的相关文章

事件和委托(Event vs. Delegate)-事件阉割版的Delegate

引言 关于事件和委托的文章看过很多,但总是记不完整.尤其是在给别人讲解的时候总是很零碎,所以在此整理一下,也供大家参考,很请大家不吝赐教. 本文从一个子类如何触发基类的事件(Event),引出事件和委托的共性和区别.再简单分析下背后原因,深层原因也给大家提供了部分参考资料.欢迎大家留言讨论.   问题 "如果我想在子类里触发父类的事件(Event)应该如何实现?"(可以先自己做下或者想下,再继续看您的做法是否也曾有我碰到技术误区)   问题分解为两步: 父类定义了一个事件(Event)

[C#参考]事件和委托的关系

前面说了委托,接下来就要说一说事件了,同时最后再说一下委托和事件的区别. 事件和委托很相似,事件就好像是被简化的针对特殊用途的委托.看下面的图: 结合前面说的委托的知识,事件的组件应该是这个样子的: 看到发布者必须有触发事件的代码,也就是必须为事件的调用留有接口,不能直接调用事件(不要觉得事件是委托类型的).这里要强调的是事件是成员,是发布者的一个成员,它不是类型,它的类型是委托类型的. 虽然事件是委托类型的,但是事件对委托做了一次封装,并且事件封装的委托是private的,所以是不能从发布者外

C#事件与委托详解【精华 多看看】

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

C#基础知识之事件和委托

本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 委托的引入:将方法作为方法的参数 我们先不管这个标题如何的绕口,也不管委托究竟是个什么东西,来看下面这两个最简单的方法,它们不过是在屏幕上输出一句问候的话语: public void GreetPeople(string name) { EnglishGreeting(name); } public

从事件来看委托

事件是基于委托,为委托提供了一种发布/订阅机制,在dotNet到处都能看到事件,一个简单的例子就是在windows应用程序中,Button类提供了Click事件,这类事件就是委托,触发Click事件时调用的处理程序方法需要定义,其参数也是由委托类型定义的,事件模型可以用下图简要说明. 在这个模型中,事件的响应者通过订阅关系直接关联在事件拥有者的事件上,我们把这种事件模型或者CLR事件模型.因为CLR事件本质上是一个委托实例,我们暂且模仿CLR属性的说法,把CLR事件定义为一个委托类型实例的包装器

C# 事件和委托

1 public class Heater { 2 private int temperature; 3 public string type = "RealFire 001"; // 添加型号作为演示 4 public string area = "China Xian"; // 添加产地作为演示 5 //声明委托 6 public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e)

总结oninput、onchange与onpropertychange事件的用法和区别 书写搜索的神奇代码

总结oninput.onchange与onpropertychange事件的用法和区别 最近手机开发一个模糊搜索的功能组建,在网上就找到这篇文章! 前端页面开发的很多情况下都需要实时监听文本框输入,比如腾讯微博编写140字的微博时输入框hu9i动态显示还可以输入的字数.过去一般都使用onchange/onkeyup/onkeypress/onkeydown实现,但是这存在着一些不好的用户体验.比如onchange事件只在键盘或者鼠标操作改变对象属性,且失去焦点时触发,脚本触发无效:而onkeyd

事件与委托

C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量).例如:委托类型 委托实例 = new 委托类型(方法名); 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易

事件和委托

委托:对方法的绑定 事件和委托的步骤1.定义委托public delegate 返回值 委托名(参数);2.基于委托定义事件public event 委托名 事件名; 3.注册事件对象.事件名 += new 委托(方法); 4.触发事件 先检查事件是否有人注册,有则触发 if (事件名 != null) 事件名(); 事件和委托,布布扣,bubuko.com