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

C# 委托与事件

时间:2024-03-13 13:58:41浏览次数:12  
标签:函数 委托 C# void SaySomething 事件 public

委托

委托的声明

委托实际上是一个函数(或叫方法)的引用。

声明委托与声明一个函数类似,需要在类型前面添加关键字delagate,例如

public delegate void SaySomething(string msg);

这便声明了一个委托,要注意的是,其类型和参数与被引用函数的返回类型和参数要一致。比如下面这2个被引用函数:

public void SayHello(string name)
{
    Console.WriteLine("Hello " + name);
}
public void SayBye(string name)
{
    Console.WriteLine("Good Bye " + name);
}

委托的实例化与使用

实例化一个委托很简单,与实例化一个类相似,下面便实例化了2个委托:

SaySomething sayHello = new SaySomething(SayHello);
SaySomething sayBye = new SaySomething(SayBye);

实例化后就能像函数一样进行使用了:

sayHello("Bob");
sayBye("Alice");

注意:从以上可以看出,委托是一种特殊的类型。

事件

创建事件

事件不是类型,使用事件时直接创建一个事件即可,事件的创建需要用到委托(和关键字event),也就是事件的类型是我们或者别人事先声明的委托,如:

public delegate void SaySomething(string msg);  // 声明一个委托
public event SaySomething E_SaySomething;       // 创建一个SaySomething事件

把委托添加到事件中,这样“事件”发生时就会通过委托调用相应的函数:

SaySomething sayHello = new SaySomething(SayHello);
SaySomething sayBye = new SaySomething(SayBye);
E_SaySomething += sayHello;  // 把委托添加到事件
E_SaySomething += sayBye;    // 把另一个委托添加到事件

通常一个事件发生时我们只完成一个委托(即执行一个函数)即可,上面我们希望该事件发生时完成2个委托(分别是sayHello和sayBye)。

上面代码也可以简写(不创建委托实例,直接把函数添加到事件即可):

E_SaySomething += SayHello;  // 注意SayHello是函数名
E_SaySomething += SayBye;

触发事件

可理解为事件发生时,完成与该事件关联的委托或函数。

E_SaySomething("Bob");

输出如下:
image-20240313133411281

完整代码

namespace zzz_delegate_event
{
    class EventTest
    {
        public delegate void SaySomething(string msg);
        public event SaySomething E_SaySomething;
        public void SayHello(string name)
        {
            Console.WriteLine("Hello " + name);
        }
        public void SayBye(string name)
        {
            Console.WriteLine("Good Bye " + name);
        }
        
        public void testDelegateEvent()
        {
            
            //SaySomething sayHello = new SaySomething(SayHello);
            //SaySomething sayBye = new SaySomething(SayBye);
            //E_SaySomething += sayHello;
            //E_SaySomething += sayBye;

            // 或简写为2行
            E_SaySomething += SayHello;
            E_SaySomething += SayBye;
            E_SaySomething("Bob");
            //E_SaySomething("Alice");

        }

    }
    
    internal class Program
    {
        
        static void Main(string[] args)
        {
            EventTest eTest = new EventTest();
            eTest.testDelegateEvent();
        }
    }
}

其它

在使用winform或WPF写桌面程序时,经常使用到事件,这是怎么实现的呢?

实际上,这些事件.Net框架已经帮我们创建好了(委托也声明好了),我们只需要编写一个函数(函数的返回类型、参数要与委托一致),然后把这些函数关联到相应的事件即可,这样事件触发时,就会执行我们定义的函数。

标签:函数,委托,C#,void,SaySomething,事件,public
From: https://www.cnblogs.com/ajream/p/18070439

相关文章

  • C++面试100问!(三)
    前言    本次专题旨在回顾C++的一些基础,方便实时总结。C++源文件从文本到可执行文件经历的过程?         预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。        编译阶段:将经过预处理后的预编译文......
  • CANape 22.0新特性:小改进大作用,为汽车测试工程带来更多便利!
    大家好!在前文中,我们已经了解了CANape22.0版本的主要新特性,现在,我们将进一步探索CANape22.0新增的一系列小而美的新特性。尽管这些特性可能不如前文提到的主要更新那样惊艳,但它们同样是CANape22.0版本的亮点所在,这些微小改进将为广大汽车测试工程师们带来更多便利并提升工作效率......
  • [转][C#]VS你正在调试 XXXX 的发布版本
    参考:https://blog.csdn.net/qsbqing/article/details/90237580按理来说,生成模式选择Debug就能解决这个问题,但是有些时候,即使生成切换到Debug,也依然还是提示正在调试发布的版本检查项目文件发现是Properties文件夹下面的AssemblyInfo.cs里面有一行Debug的语句,导致不能调试。具......
  • CVE-2023-48906
    github:https://github.com/bluekitchen/btstack/issues/546Inthebtstacksourcecode,wecanfindaninterestingpieceofcode.charchar_for_nibble(intnibble){staticconstchar*char_to_nibble="0123456789ABCDEF";if(nibble<1......
  • JSON序列化之旅:深入理解.NET中的JsonResult与自定义ContractResolver
    在.NET开发的世界里,JSON已成为一种无处不在的数据交换格式。无论是WebAPI还是微服务架构,我们都经常需要将对象序列化成JSON格式,以方便客户端的接收和处理。今天,我想和大家分享一段关于.NET中JsonResult使用的代码,以及它背后的一些细节。这段代码来自于一个典型的ASP.NETCore应......
  • ARC173A Neq Number 题解
    ARC173ANeqNumber题目大意正整数\(X\)如果满足以下条件,则称为"Neq数":当\(X\)用十进制符号书写时,没有两个相邻的字符是相同的。例如,\(1\)、\(173\)和\(9090\)是Neq数,而\(22\)和\(6335\)不是。给你一个正整数\(K(1\leqK\leq10^{12})\)。请找出第\(K\)小......
  • ChatGLM3 源码解析(五)
    PrefixEncoder#根据前缀ID获取前缀嵌入#前缀嵌入将连接到分头之后的K和V上classPrefixEncoder(torch.nn.Module):"""Thetorch.nnmodeltoencodetheprefixInputshape:(batch-size,prefix-length)Outputshape:(batch-size,prefix-length......
  • calico ipip模式实验
    实验步骤1-创建网络空间,设备,并配置HOST_IP=$(hostname-I|awk'{print$1}')POD1_IP=10.96.30.11POD2_IP=10.96.30.12GATEWAY_IP=169.254.1.1#1.创建networknamespaceipnetnsaddpod1ipnetnsaddpod2#2.创建vethpair并加入到namespaceiplink......
  • C# danbooru Stable Diffusion 提示词反推 Onnx Demo
    目录说明效果模型信息项目代码下载 C#danbooruStableDiffusion提示词反推OnnxDemo说明模型下载地址:https://huggingface.co/deepghs/ml-danbooru-onnx效果模型信息Model Properties-----------------------------------------------------------------......
  • springmvc入门登录功能
    学习springmvc的时候的一个入门功能,登录功能。配置好web框架,导入需要springjar包和springmvc需要的两个jar包,就可以编码了,首先写了登录需要的jsp页面<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Title</title></hea......