首页 > 编程语言 >C# 委托、事件、Func、Action

C# 委托、事件、Func、Action

时间:2024-11-18 14:44:15浏览次数:1  
标签:Console 委托 C# cat int Func Action myD

委托:

在 .NET 中委托提供后期绑定机制。 后期绑定意味着调用方在你所创建的算法中至少提供一个方法来实现算法的一部分,它允许将方法作为参数传递给其他方法

可以把委托想象成一个合同,规定了方法的签名(比如方法的参数类型和返回值)。这个合同允许你将一个符合这个签名的方法绑定到委托上。当委托被调用时,它就会执行绑定的方法

string a, b, x;

static int CWStr(int s)
{
    return s;
}

static int Add(int a)
{
    return a + 10;
}

static int DoSomeSthing(MyDelegate myD)
{
    myD += Add;
    return myD(100);
}

MyDelegate myD = null;
myD += Add;
a = myD(10) + "";

myD = CWStr;
b = $"This Is Console Word:{myD(20)}";

x = DoSomeSthing(myD) + "";

Console.WriteLine($"{a},\r\n{b},\r\n{x}");
Console.ReadKey();
public delegate int MyDelegate(int a);

  

在委托delegate出现了很久以后,微软的.NET设计者们终于领悟到,其实所有的委托定义都可以归纳并简化成只用Func与Action这两个语法糖来表示。

其中,Func代表有返回值的委托,Action代表无返回值的委托。有了它们两,我们以后就不再需要用关键字delegate来定义委托了。

string a, b, x;

static int CWStr(int s)
{
    return s;
}

static int Add(int a)
{
    return a + 10;
}

static int DoSomeSthing(Func<int,int> myD)
{
    myD = Add;
    return myD(100);
}

Func<int,int> myD = null;
myD += Add;
a = myD(10) + "";

myD = CWStr;
b = $"This Is Console Word:{myD(20)}";

x = DoSomeSthing(myD) + "";

Console.WriteLine($"{a},\r\n{b},\r\n{x}");
Console.ReadKey();

 

事件

事件是一种特殊的委托,且只能用+=或-=

事件是对象用于(向系统中的所有相关组件)广播已发生事情的一种方式。 任何其他组件都可以订阅事件,并在事件引发时得到通知,它允许一个对象将状态的变化通知其他对象,而不需要知道这些对象的细节

可以把它理解为一个通知系统:一个对象(事件的“发布者”)发布事件,其他对象(事件的“订阅者”)可以订阅这个事件,收到通知后做出反应。

Cat cat = new Cat();
new People(cat);
new Mouse(cat);
cat.DoSomting();

public delegate void ActionHandler();

class Cat
{
    public event ActionHandler Action;

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

class People
{
    public People(Cat cat)
    {
        cat.Action += () =>
        {
            Console.WriteLine("人醒了");
        };
    }
}

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

  

 

标签:Console,委托,C#,cat,int,Func,Action,myD
From: https://www.cnblogs.com/SmallChen/p/18552527

相关文章

  • SV 接口 Interface
    在SystemVerilog(SV)中,接口(interface)是一种用于组织和传递多个信号的机制,它帮助减少模块间连接信号的冗余,并提高设计的可读性和可维护性。接口使得多个模块之间的信号传递更加模块化,减少了重复代码的编写。接口不仅仅是信号的集合,还可以包含函数、任务和约束。通过接口,多个模......
  • Swagger 3.0 & MybatisPlus 主键BigDecimal 使用过程问题
    PS:本来用的是2.x的,但是因为换了后端框架,导致版本不适配,于是调整到3.0<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>&......
  • SV 接口 Interface 补充(约束方法)
    在SystemVerilog中,如果你希望限制接口的某些部分在特定条件下可用或不可用,可以利用约束(constraint)、任务(task)、函数(function)以及接口内的访问控制来实现。这种限制通常是基于设计需求或者验证需求,常见的应用场景包括:限制某些信号在某些情况下的访问,或者在特定条件下禁止或启......
  • cpp 命令行选项参数获取
    本文主要讲解getopt和getopt_long函数,这两个函数并不是C++标准库的一部分,而是POSIX标准的函数,主要用于解析命令行选项,在很多UNIX兼容系统中得到了广泛使用。我们在给某个程序指定选项和参数时,通常是如下形式:program-a-bvalue--typetypanme其中横线后面的名称就......
  • SV 接口 Interface 补充(调用传参举例)
    在SystemVerilog(SV)中,接口可以作为模块的端口传递,也可以在任务和函数中传递作为参数。通过接口传递参数使得多个模块可以共享相同的信号集,减少冗余代码,提高设计的可重用性。以下是一些例子,展示了如何在模块和任务/函数中使用接口作为参数传递。1.接口作为模块的端口传......
  • [ABC380C] Move Segment 题解
    [ABC380C]MoveSegment题解本题主要考察思维能力,其实不难。题目大意给你一个字符串\(s\),\(s\)由\(0\)和\(1\)构成,将其分为块中只有一种数字的块。将给定的第\(k\)块数字为\(1\)的块与第\(k-1\)块合并,并输出修改后的字符串。思路分析直接按照题意模拟即可。建......
  • DolphinScheduler心脏:Quartz的定时任务调度框架深度解析
    Quartz是一个开源的Java作业调度框架,它提供了强大的定时任务调度功能。在DolphinScheduler中,Quartz用于实现定时任务的调度和管理。DolphinScheduler通过QuartzExecutorImpl类与Quartz集成,将工作流及其定时管理操作与Quartz调度框架相结合,实现任务的调度执行。本文将详细剖析Quar......
  • C#通过ZXing 打印条形码
    1、通过nuget安装Zxing插件并引用usingZXing;usingZXing.QrCode.Internal;usingZXing.Common;usingZXing.QrCode;2、演示界面 3、打印效果 4、主要代码双击printDocument1控件,编写如下示例代码:privatevoidprintDocument1_PrintPage(objectsend......
  • C++多线程编程
    一、概念多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。传统的C++(C++11标准之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthread.h>,或者windows下的<windows.h>。1.1其......
  • catia零部件装配结构搭建
    catia零部件装配结构搭建ProductCatia的product文件保存装配结构和各个零部件之间的参数关系与约束关系,不保存三维实体本身。装配结构搭建通常在装配结构搭建的时候不考虑零部件之间的约束关系,只保留装配结构与位置关系(零部件的三维坐标与当前的姿态)。程序思路一般情况下,会......