在C#中,委托和事件是比较容易混淆的两个知识点,本篇博客就记录一下委托和事件之间的区别。

定义上的区别

委托:委托实际上是一个类,用来表示一个函数,可以理解为C++中的函数指针。

事件:事件是一个修饰符,用来修饰一个委托类型的属性,表示该委托的部分功能被限制了。

我们可以这么理解:委托是类,定义了委托后,就可以像使用类一样的来使用这个委托,而事件修饰了委托后则是表示限制这个委托的部分功能,使其满足作为事件的规则。

那么事件究竟限制了委托的什么功能呢?主要是下面的这两个限制:

调用的限制

委托的调用没有限制,可以在任意的地方进行调用,而事件修饰过的委托只能在定义自己的类中进行调用(注意连子类都不允许调用),如下:

  1. using System;
  2.  
  3. namespace Study
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. new App();
  10.  
  11. Console.Read();
  12. }
  13. }
  14.  
  15. public delegate void Foo();
  16.  
  17. public class Test
  18. {
  19. public Foo foo1;
  20.  
  21. public event Foo foo2;
  22.  
  23. public Test()
  24. {
  25. foo1 += Func;
  26. foo1();
  27.  
  28. foo2 += Func;
  29. foo2();
  30. }
  31.  
  32. public void Func()
  33. {
  34. Console.WriteLine("Test Func");
  35. }
  36. }
  37.  
  38. public class App
  39. {
  40. public App()
  41. {
  42. Test test = new Test();
  43.  
  44. test.foo1();
  45.  
  46. test.foo2();//这个会报错
  47. }
  48. }
  49. }

注册的限制

委托可以使用“=”、“+=”、“-=”三种符号来表示赋值,添加和移除一个函数,而事件修饰过的委托在自己的类中也可以使用这三个符号(注意子类也属于外部的类),而在外部的类中时则只能使用“+=”和“-=”来添加移除函数,不能使用“=”进行赋值,下面我们来看一个具体的例子:

  1. using System;
  2.  
  3. namespace Study
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. new App();
  10.  
  11. Console.Read();
  12. }
  13. }
  14.  
  15. public delegate void Foo();
  16.  
  17. public class Test
  18. {
  19. public Foo foo1;
  20.  
  21. public event Foo foo2;
  22.  
  23. public Test()
  24. {
  25. foo1 = Func;
  26. foo1 += Func;
  27. foo1();
  28.  
  29. foo2 = Func;
  30. foo2 += Func;
  31. foo2();
  32. }
  33.  
  34. public void Func()
  35. {
  36. Console.WriteLine("Test Func");
  37. }
  38. }
  39.  
  40. public class App
  41. {
  42. public App()
  43. {
  44. Test test = new Test();
  45.  
  46. test.foo1 = Func;
  47. test.foo1 += Func;
  48. test.foo1();
  49.  
  50. test.foo2 = Func;//这个会报错
  51. test.foo2 += Func;
  52. test.foo2();//这个会报错
  53. }
  54.  
  55. public void Func()
  56. {
  57. Console.WriteLine("App Func");
  58. }
  59. }
  60. }

C#一些知识点:委托和事件的区别的更多相关文章

  1. c#之委托和事件的区别

    1.什么是委托,这里就不做介绍了,如果想了解可以查看博客:http://www.cnblogs.com/xiaoxiaogogo/p/3571494.html 下面开始对事件进行介绍 1.定义事件以及 ...

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

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

  3. 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别

    在"实现观察者模式(Observer Pattern)的2种方式"中,曾经通过接口的方式.委托与事件的方式实现过观察者模式.本篇体验使用Action实现此模式,并从中体验委托与事件 ...

  4. c# 委托与事件的区别

    委托与事件的区别 委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装.),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别.事件的内部 ...

  5. C#中委托和事件的区别

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

  6. 8.C#知识点:委托和事件

    知识点目录==========>传送门 首先推荐两篇大牛写的委托和事件的博客,写的超级好!看了就包你看会,想学习的朋友直接看这两篇就足以,我自己写的是算是自己学习的纪录. 传送门======== ...

  7. C#多播委托和事件的区别与关系

    事件是对委托的封装. 如果一个类里,你把一个委托声明为 public 了,那么外部就可以随意改变委托变量的值,包括清空委托变量等,这样的话就违背了面向对象思想的封装特性:但如果声明为 private ...

  8. C#委托和事件的区别

    “委托是具有相同签名的函数(方法)的类型,事件是委托的应用方式之一” ---来自评论区老司机 delegate 是为了在C#中把函数作为对象传来传去而实现的一个“函数包装”.由于在C#中函数是二等公民 ...

  9. C# .Net 委托和事件的区别

    在.net中,事件是一种特殊的委托,那他到底特殊在哪,换句话说,加上event关键字到底有什么用,我理解主要有两方面,下面用实例说明: 一 .事件只能在本类型内部“触发”,委托不管在本类型内部还是外部 ...

随机推荐

  1. crtbegin_dynamic.o: No such file: No such file or directory

    /homesec/android2/zhangbin/053work3/hi050src/HiSTBAndroidV400R001C00SPC050B012/prebuilt/linux-x86/to ...

  2. 3732 Ahui Writes Word

    // N个物品 放进容量为C的背包里面 要求价值最大// 一看 第一反应是0 1背包 不过 N=100000 C=10000// 注意到 v,c在 10以内// 那么 最多就100种组合了 然后就转化 ...

  3. 从网页监听Android设备的返回键

    最近搞Android项目的时候,遇到一个比较蛋疼的需求,需要从Client App调用系统浏览器打开一个页面,进行杂七杂八的一些交互之后,返回到App.如何打开浏览器和如何返回App这里就不说了,有兴 ...

  4. js时间日期转时间戳

    var contractstarttimea='2016-01-01'; var contractendtimea='2016-05-01'; var contractstart = Date.par ...

  5. jdbc:oracle:thin:@192.168.3.98:1521:orcl(详解)

    整理自互联网 一. jdbc:oracle:thin:@192.168.3.98:1521:orcljdbc:表示采用jdbc方式连接数据库oracle:表示连接的是oracle数据库thin:表示连 ...

  6. POJ 3233 Matrix Power Serie

    题意:给一个n×n的矩阵A,求S = A + A2 + A3 + … + Ak. 解法:从式子中可得递推式S(n) = S(n - 1) + An,An = An-1×A,可得矩阵递推式 [S(n), ...

  7. Metaspace 之一--java8 去掉 perm 用 Metaspace 来替代

    正如大家所知,JDK 8 Early Access版已经提供下载.这使开发者可以体验Java8的新特性.其中之一,是Oracle从JDK7发布以来就一直宣称的要完全移除永久代空间.例如,字符串内部池, ...

  8. TextView字体和背景图片 设置透明度

    背景图片透明度设置  viewHolder.relative_layout.getBackground().setAlpha(225);     0  ---  225 ((TextView)tv). ...

  9. NSThread 多线程相关

    1.下面的代码,有2点需要注意,1>就是 就是thread:所传得参数,这里传得的是nsarray 当然也可以传其他的类型.2> [self performSelectorOnMainTh ...

  10. 《Python CookBook2》 第一章 文本 - 检查字符串中是否包含某字符集合中的字符 && 简化字符串的translate方法的使用

    检查字符串中是否包含某字符集合中的字符  任务: 检查字符串中是否出现了某个字符集合中的字符 解决方案: 方案一: import itertools def containAny(seq,aset): ...