【系列文章目录】
前言
本篇介绍事件
实际上事件我使用的比较少,委托用的更多,所以有说的不对的地方,欢迎指正
一、什么是事件
1.事件是特殊的委托
还是先看看文档吧
事件和委托类似,事件是后期绑定机制。 实际上,事件是建立在对委托的语言支持之上的。
那么事件与委托有什么不同呢?
我们先看看文档中对事件在C#中的设计目的是什么
-
在事件源和事件接收器之间启用非常小的耦合。 这两个组件可能不会由同一个组织编写,甚至可能会通过完全不同的计划进行更新。
-
订阅事件并从同一事件取消订阅应该非常简单。
-
事件源应支持多个事件订阅服务器。 它还应支持不附加任何事件订阅服务器。
2.我理解的事件
我的理解是这样的
-
委托可以委托他人帮我们完成一件事情
-
而事件是当我们完成一件事情时通知他人
所以事件有以下特点
- 事件可以被订阅,但不能被外部触发(外部可以
+=
和-=
但不能Invoke
) - 事件不可被完全单独指向某个函数(事件不可以
=
)
举个具体点的栗子
我在CSDN写博客,有人订阅了我
在我发博客的时候,会通知所有订阅我的人,我发了新的博客
别人也不能上我的账号替我发博客
这就是可以被订阅,但不能被外部触发(
截止至写本文的时候,我还只有一个粉丝(惨案。。。)
但是我的博客并不是完全只为了这个粉丝而写的
这就是不可被完全指向
二、使用事件
1.官方例子
-
事件声明:
public event EventHandler<FileListArgs> Progress;
EventHandler<FileListArgs> 的类型必须为委托类型
-
事件调用:
Progress?.Invoke(this, new FileListArgs(file));
-
订阅:
EventHandler<FileListArgs> onProgress = (sender, eventArgs) => Console.WriteLine(eventArgs.FoundFile); fileLister.Progress += onProgress;
-
取消订阅
fileLister.Progress -= onProgress;
2.我的使用
实际使用中声明事件我习惯使用Action
public event Action<EventArgs> MyEvent;
三、总结
- 事件基于委托
- 事件不同于委托的地方
- 只能在声明类的内部Invoke
- 使用add和remove(+=和-=)
- 不能使用set(=)