【从头构筑C#知识体系】1.4 事件

【系列文章目录】



前言

本篇介绍事件

实际上事件我使用的比较少,委托用的更多,所以有说的不对的地方,欢迎指正

【C#文档——事件】


一、什么是事件

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(=)

猜你喜欢

转载自blog.csdn.net/ruanlinxi1994/article/details/125438625