C#一些知识点:委托和事件的区别

在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 }
时间: 2024-10-06 18:01:57

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

c# 委托与事件的区别

委托与事件的区别 委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装.),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别.事件的内部是用委托实现的.(举例子:三种实现事件方式的区别(直接用委托实现.用私有委托+公有方法模拟事件,直接用event事件实现)) 因为对于事件来讲,外部只能“注册自己+=.注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这

c#之委托和事件的区别

下面开始对事件进行介绍 1.定义事件以及事件的编译原理 首先定义事件对应的委托: 1 public delegate void ThreeClickEventDel(); 然后对应事件变量:(其实就是在委托前面加一个event) public event ThreeClickEventDel ThreeClickEvent; 反编译之后:是:一个“私有委托”和两个“公有”的“add”和“remover”方法 1)因为是私有委托:所以只有类的内部可以调用,在类外部就不能被调用.创建的类的实例也是不

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

这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用.具体如下: 大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. 一.通过委托执行方法 1 2 3 4 5 6 7 8 9 10 11 12 13 1

C#中委托和事件的区别

大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. □ 通过委托执行方法 class Program { static void Main(string[] args) { Example example = new Example(); example.Go(); Console.ReadKey(); } } public class Example { pu

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

知识点目录==========>传送门 首先推荐两篇大牛写的委托和事件的博客,写的超级好!看了就包你看会,想学习的朋友直接看这两篇就足以,我自己写的是算是自己学习的纪录. 传送门==========>C# 中的委托和事件         C# 中的委托和事件续. 委托是什么? 委托是一个类,它定义了一种的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性. --摘自百度百

委托与事件的区别

截止到目前为止,我很少使用事件,经常使用委托,但是我并不清楚事件存在的原因,或者说,委托和事件到底有什么区别? 我在网上搜的一般情况下都会写委托是一个类,事件是委托的对象,但是用的时候会发现, 执行出来完全一模一样,什么调用Invoke,什么Remove和-=,如果这就是区别,那事件存在的意义在哪里? 马克思说过:存在即合理 后来我又搜了一些博客,看了一下终于让我找到了我认为最本质的区 区别主要在外部触发,事件是不允许的,具体看下边例子: 事件ActEvent在外部只能出现在+=或者-=的左边,

委托和事件的区别

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性. 有了委托为什么还需要事件?笔者认为事件是为了对委托进一步封装,更能体现面向对象的思想,也使得程序具有更大的灵活性. 下面看一个观察者模式的代码.需求是:假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1.扬声器会开始发出语音,告诉你水的温度:2.液晶屏也会改变水温的显示,来提

C#委托和事件的区别

“委托是具有相同签名的函数(方法)的类型,事件是委托的应用方式之一” ---来自评论区老司机 delegate 是为了在C#中把函数作为对象传来传去而实现的一个“函数包装”.由于在C#中函数是二等公民,你不能把它定义在class的层级上,也不能把它作为对象来传递.因此平台提供了一个盛放函数的“容器“,当你声明了一个这样的容器后,它里面就可以放进所有和你声明时签名一致的函数或方法. 因为每次声明和创建委托都是在做重复性的工作,不符合OOP的气质,微软提供了泛型委托: Action  无参没有返回值

浅谈委托和事件(一)

浅谈委托和事件(一) 关于委托和事件,可能是.NET或者说是面向对象编程语言中的一个比较重要又比较难以理解的概念.关于这一话题,园子里的人也写了很多文章,最经典的可能就是张子阳的C#中的委托和事件这两篇文章了,之前也看过MSDN 上的WebCast深入 "委托和事件".可能和很多人一样,刚开始读的时候,觉得很清楚,但是过了一段时间好像又忘记了委托和事件的区别,知道很久以前,在一次面试中我被问到委托和事件有什么区别,一下子就说不清了. 所以这里稍微理一下,也算是自己的一个总结.当然,还是