首页 > 编程语言 >C# - 委托与事件

C# - 委托与事件

时间:2024-05-09 12:35:24浏览次数:27  
标签:publisher magazineName string Observer C# void 委托 事件 public

委托与事件

委托

class Program
{
    static void Main(string[] args)
    {
        Publisher publisher = new Publisher("篮球先锋报");

        Observer observerA = new Observer("老A");
        publisher.Magazine += observerA.RecvMagazine;

        Observer observerB = new Observer("老B");
        publisher.Magazine += observerB.RecvMagazine;

        publisher.PublishMagezine();
        //或者使用下面的方式  区别就是一个在定义的内部触发,一个在外部触发
        publisher.Magazine?.Invoke(publisher.magazineName);
        Console.ReadKey();
    }
}

public class Observer
{
    private string name;
    public Observer(string name)
    {
        this.name = name;
    }

    public void RecvMagazine(string message)
    {
        Console.WriteLine($"{this.name} recv {message}, 仔细读了一番");
    }
}

public class Publisher
{
    public string magazineName;
    public Publisher(string magazineName)
    {
        this.magazineName = magazineName;
    }

    public delegate void MagazineDelegate(string message);
    public MagazineDelegate Magazine;

    public void PublishMagezine()
    {
        Magazine?.Invoke(this.magazineName);
    }
}

事件

class Program
{
    static void Main(string[] args)
    {
        Publisher publisher = new Publisher("篮球先锋报");

        Observer observerA = new Observer("老A");
        publisher.Magazine += observerA.RecvMagazine;

        Observer observerB = new Observer("老B");
        publisher.Magazine += observerB.RecvMagazine;

        publisher.PublishMagezine();
        //下面的方式会出现编译错误  只允许在定义的内部触发,不允许在外部触发
        publisher.Magazine?.Invoke(publisher.magazineName);
        Console.ReadKey();
    }
}

public class Observer
{
    private string name;
    public Observer(string name)
    {
        this.name = name;
    }

    public void RecvMagazine(string message)
    {
        Console.WriteLine($"{this.name} recv {message}, 仔细读了一番");
    }
}

public class Publisher
{
    public string magazineName;
    public Publisher(string magazineName)
    {
        this.magazineName = magazineName;
    }

    public delegate void MagazineDelegate(string message);
    public event MagazineDelegate Magazine;

    public void PublishMagezine()
    {
        Magazine?.Invoke(this.magazineName);
    }
}

经典面试题

猫叫、老鼠跑了,主人醒来了

class Program
{
    static void Main(string[] args)
    {
        Cat cat = new Cat();
        Mouse m = new Mouse(cat);
        People p = new People(cat);
        cat.Scream();
    }
}

public class Cat
{
    public delegate void ScreamHandler();
    public event ScreamHandler OnScream;

    public void Scream()
    {
        Console.WriteLine("猫叫了一声");
        OnScream?.Invoke();
    }

}

public class Mouse
{
    public Mouse(Cat c)
    {
        c.OnScream += () => { Console.WriteLine("老鼠跑了"); };
    }
}

public class People
{
    public People(Cat c)
    {
        c.OnScream += () => { Console.WriteLine("主人醒来了"); };
    }
}

//输出:
//猫叫了一声
//老鼠跑了
//主人醒来了

委托与事件的区别

  1. 事件基于委托,但并非委托 可以把事件看成委托的代理。在使用者看来,只有事件,而没有委托。
  2. 事件是对委托的包装 保护委托字段,对外不开放。所以外部对象没法直接操作委托。提供了Add和Remove方法,供外部对象订阅事件和取消事件。事件的处理方法在对象外部定义,而事件的执行是在对象的内部。至于事件的触发,何时何地无所谓。

什么时候使用委托与事件?

如果一个委托不需要再其定义的类之外被触发,那么就可以将其转化为事件,这样可以保证它不会在外部被随意触发。

标签:publisher,magazineName,string,Observer,C#,void,委托,事件,public
From: https://www.cnblogs.com/ShenhaoCore/p/18181643

相关文章

  • 一键自动化博客发布工具,用过的人都说好(cnblogs篇)
    cnblogs和其他的博客平台相比会比较复杂,需要设置的项目也比较多一些,弄懂了cnblogs的实现方式,那么你应该对selenium的整个框架使用已经烂熟于心了。除了正常的标题,内容,摘要之外,cnblogs还需要设置个人分类,合集,投稿选项,投稿至网站分类,tags标签等内容。要填的东西比较多,比较复杂。接......
  • P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G
    链接:https://www.luogu.com.cn/problem/P2341题目:思路:tarjan缩点:把所有强连通分量缩成一个点,然后统计出度为0的缩点,如果只有一个,那么能成为明星的数量就是该缩点扩充后的个数;如果不止一个,那就是0.代码:额,就是不知道为什么debug了两节课.......#include<iostream>#include<v......
  • centos7.9 python3安装
    centos7.9python3安装在CentOS7.9上安装Python3,你可以使用yum来安装Python3的包。以下是安装Python3.6的步骤:首先,打开终端。安装Python3.6的依赖包:  sudoyuminstall-ygccopenssl-develbzip2-devellibffi-devel下载Python3.6的源......
  • Hogervorst classAB结构
    classAB减少运放的噪声和漂移??轨到轨放大器的缺点是当共模输入电压变化时,其中由于共模输入范围存在重叠区,所以导致N管和P管同时导通时其跨导会变化,这会影响电路频率特性,因为一个好的频率补偿电路需要一个恒定的跨导,所以为了在共模输入范围内得到恒定的跨导提升在共模输入在较低电......
  • CompletableFuture学习总结
    CompletableFuture简介在Java8中,CompletableFuture提供了非常强大的Future的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合CompletableFuture的方法。Java中的异步计算异步计算很难推理。通常,我们......
  • nicegui:Python 图形界面库,简单好用
    前言在现代计算机应用程序开发中,图形用户界面(GUI)是用户与程序交互的重要组成部分。然而,GUI开发往往需要大量的代码和复杂的布局,给开发者带来了一定的挑战。在本篇博文中,将介绍nicegui,它是一个简单易用的图形用户界面库,提供了一种简化GUI开发的方式,使开发者能够更快速地构建吸......
  • locust:Python 分布式压力测试(带WebUI)
    Locust介绍它采用纯Python实现,是一个分布式用户负载测试的工具。使用基于Requests库的客户端发起请求,使编写脚本大大简化;在模拟并发方面摒弃进程和线程,完全基于时间驱动,采用协程(gevent)提供的非阻塞IO和coroutine来实现网络层的并发请求。因此单台压力机也能产生数千......
  • Nginx负载均衡、动静分离Tomcat案例实战
    一、前言1)Tomcat是一款开源的、免费的WEB软件服务器,是隶属于Apache基金会旗下的,主要是用于去发布网站代码、提供网页信息服务的。用户通过浏览器可以实现网站页面的访问。2)TomcatWEB软件默认可以处理静态网页(Apache、Nginx),同时也可以处理动态网页,主要是处理JSP动态网页,JSP(Java......
  • LLaMA-Factory 训练 Llama3-Chinese-8B-Instruct 相关报错问题解决
    模型路径up主为llama中文社区模型地址https://www.modelscope.cn/models/FlagAlpha/Llama3-Chinese-8B-Instruct/summarysysinfov10032gnvcc--versioncuda11.8pythonimporttorchprint(torch.version)13.11pipinstallflash_attntimeout2下载whl报这个错......
  • text-generation-webui 推理模型Qwen1.5-7B-Chat相关报错问题解决
    推理代码text-generation-webui推理模型Qwen1.5-7B-Chatsysinfo nvcc--versioncuda11.8importtorch>>>print(torch.__version__)1路径错误2依赖没安装ImportError:Thismodelingfilerequiresthefollowingpackagesthatwerenotfoundinyourenvironme......