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

浅谈C# 委托与事件

时间:2024-09-02 14:23:01浏览次数:10  
标签:publisher 浅谈 委托 C# void int 事件 public

一、基本介绍

        委托(Delegate)是一种特殊的类型,它定义了方法的类型,使得可以将方法作为参数传递。事件(Event)是基于委托的一种特殊用途,用于实现事件驱动的编程模型。

委托

委托可以看作是对方法的一种引用,它允许你将方法作为参数传递给其他方法。委托可以指向任何返回类型和参数列表与委托类型匹配的方法。

委托的声明
public delegate int Operation(int x, int y); // 声明一个委托,用于执行加法操作

委托的实例化和使用

public class Program
{
    public static void Main()
    {
        Operation op = new Operation(Add); // 实例化委托
        int result = op(5, 3); // 调用方法
        Console.WriteLine("结果是:{0}", result);

        op = new Operation(Subtract); // 改变委托引用的方法
        result = op(5, 3);
        Console.WriteLine("结果是:{0}", result);
    }

    public static int Add(int x, int y)
    {
        return x + y;
    }

    public static int Subtract(int x, int y)
    {
        return x - y;
    }
}

事件

事件是一种特殊的多播委托,用于在对象间发布和订阅消息。事件的发布者(发布事件的对象)和订阅者(对事件感兴趣的对象)通过事件进行通信。

事件的声明
public class Publisher
{
    public event EventHandler OnChange; // 声明事件

    protected virtual void OnChangeEventHandler(EventArgs e)
    {
        OnChange?.Invoke(this, e);
    }

    public void Change()
    {
        // 触发事件
        OnChangeEventHandler(new EventArgs());
    }
}

事件的订阅和取消订阅
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        publisher.OnChange += OnChangeHandler; // 订阅事件
    }

    public void Unsubscribe(Publisher publisher)
    {
        publisher.OnChange -= OnChangeHandler; // 取消订阅事件
    }

    private void OnChangeHandler(object sender, EventArgs e)
    {
        Console.WriteLine("事件被触发!");
    }
}

使用事件
public class Program
{
    public static void Main()
    {
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber();

        subscriber.Subscribe(publisher); // 订阅事件
        publisher.Change(); // 触发事件

        subscriber.Unsubscribe(publisher); // 取消订阅
        publisher.Change(); // 再次触发事件,但不会有输出
    }
}

标签:publisher,浅谈,委托,C#,void,int,事件,public
From: https://blog.csdn.net/a876106354/article/details/141818888

相关文章

  • I2C通信中,使用FIFO时的读写时序
    在I2C通信中,使用FIFO(First-InFirst-Out)缓冲区可以显著提高数据传输的效率和可靠性。当使用FIFO时,读写时序会有一些特定的要求和优化,以确保数据传输的正确性和高效性。下面详细介绍使用FIFO时的读写时序。读写时序的基本原则在使用I2CFIFO时,读写时序需要考虑以下几个方面:初......
  • CF 2001 D. Longest Max Min Subsequence(*1900) 思维
    CF2001D.LongestMaxMinSubsequence(*1900)思维题目链接题意:给你一个长度为\(n\)的序列\(a\),设\(S\)是\(a\)的所有可能的非空子序列的集合,且没有重复的元素。你的目标是找出\(S\)中最长的序列。如果有多个序列,请找出将奇数位置上的项乘以\(−1\)后,使词序最小......
  • 一个练习项目,好玩的bbs-go-echo
    代码:packagemain/**goenv-wGO111MODULE=ongoenv-wGOPROXY=https://goproxy.cngomodinitgosgomodtidygomodvendor*/import("crypto/md5""database/sql""fmt""log""math"......
  • 一个练习项目,好玩的bbs-go-chi
    代码:packagemain/**goenv-wGO111MODULE=ongoenv-wGOPROXY=https://goproxy.cngomodinitgosgomodtidygomodvendor*/import("crypto/md5""database/sql""encoding/json""fmt""......
  • 模拟信号采集卡设计方案:FMC210-1路1Gsps AD、1路2.5Gsps DA的FMC子卡 信号采集卡
    FMC210-1路1GspsAD、1路2.5GspsDA的FMC子卡  一、板卡概述   FMC-1AD2DA是北京太速科技自主研发的一款1路1GAD采集、1路2.5GDA回放的FMC子卡。板卡采用标准FMC子卡架构,可方便的与其他FMC板卡实现高速互联,可广泛用于高频模拟信号采集、雷达系统测......
  • 一文搞懂lcd偏压问题
    液晶显示器中的“交叉效应”(CrossTalk)是指在某些情况下,液晶显示器的像素之间出现干扰,导致图像显示不准确或失真的现象。交叉效应可能会导致相邻像素的内容泄漏到彼此之间,影响图像的清晰度和对比度。交叉效应通常发生在液晶分子的响应速度较慢或电场分布不均匀的情况下。以下是交......
  • 一个练习项目,好玩的bbs-perl-mojolicious
    代码:#!D:/software/Strawberry/perl/bin/perl.exeBEGIN{push(@INC,'D:/workspace/studys/study_bbs');}useMojolicious::Lite-signatures;useutf8;useNet::MySQL;useEncode;usePOSIX;useJSONqw/encode_jsondecode_json/;useDigest;o......
  • 在 VS Code 中使用 Git 源代码管理【Mac 版】
    目录一、Git使用文档二、使用示例1、复制远程仓库地址2、查看当前所在的分支2.1、界面查看2.2、终端查看3、修改/新增文件4、显示增改的详细内容5、添加暂存区6、查看/取消暂存的更改7、提交本地代码库8、待提交文件9、推送到远程仓库10、验证11、查看推送记录11.1、关于gitlog......
  • NocoBase 与百事通:为法律行业带来全新变革
    关于百事通上海百事通信息技术股份有限公司成立于2006年,是大型创新型法律服务提供方,构建了法律数字化智能平台,为下一代法律解决方案提供创新的技术和服务。百事通业务覆盖全国31省市自治区,积极参与公共法律服务体系建设,年度服务达到700万人次,市占率达50%。在企业法律科......
  • 一个练习项目,好玩的bbs-perl-dancer
    代码:#!D:/software/Strawberry/perl/bin/perl.exeBEGIN{push(@INC,'D:/workspace/studys/study_bbs');}useutf8;useDancer;useDancer::Serializer::JSON;useNet::MySQL;useEncode;usePOSIX;useJSONqw/encode_jsondecode_json/;useDi......