第十七章 C# Action和Func委托 多播 匿名函数 lambda表达式

2023-11-06

一.使用 Action和Func委托

方法的返回类型 和 名字千千万万 无法对每个方法都去定义对应的委托  .nt为了方便使用委托 定义了两个泛型委托

Action  Action委托表示一个void返回类型的方法

例1

  MyDelegate myDelegate   =new MyDelegate (ProgramMothod);
            myDelegate();

            Action myAction = new Action (ProgramMothod);
            myAction ();


 delegate void MyDelegate();

    private static void ProgramMothod() {
            Console.WriteLine("123");

        }

例2

MyDelegate1 myDelegate1  =  new MyDelegate1 (ProgramMothod);
            myDelegate1(10);

            Action<int> action1 = new Action<int> (ProgramMothod);
            action1(10);

 delegate void MyDelegate1(int a);

  private static void ProgramMothod(int a)
        {
            Console.WriteLine(a);

        }

例3

 Action<string,int> action2 =new Action<string, int> (ProgramMothod);
            action2("111", 200);

private static void ProgramMothod(string b ,int a)
        {
            Console.WriteLine(a);
            Console.WriteLine(b);

        }

/Func委托表示一个带返回类型的方法

例1

 MyDelegate3 myDelegate3 = new MyDelegate3(ProgramMothod1);
            myDelegate3();
            Func<string> func = new Func<string>(ProgramMothod1);
            func();


 delegate string MyDelegate3();


  private static string ProgramMothod1()
        {

            return "123";

        }


例2

 MyDelegate4 myDelegate4 =new MyDelegate4 (ProgramMothod2);
             string tempStr2 =   myDelegate4(10);

            //如果有参数 返回值类型在最后
            Func<int,string> func1 = new Func<int ,string>(ProgramMothod2);
            string tempStr1  = func1 (10);


 delegate string MyDelegate4(int b);


 private static string ProgramMothod2(int a)
        {

            return a.ToString();

        }

例3

   MyDelegate5 myDelegate5 =new MyDelegate5 (ProgramMothod3);
             string tempStr =   myDelegate5(10,20);

            Func<int,int,string> func2 =new Func<int, int, string> (ProgramMothod3);
            string tempStr3 =   func2(10,20);


 delegate string MyDelegate5(int b, int a);


  private static string ProgramMothod3(int a,int b)
        {

            return a.ToString()+b.ToString();

        }

委托的多播

1.委托对象可使用 "+" 运算符进行合并。

2."-" 运算符可用于从合并的委托中移除组件委托

3.只有相同类型的委托可被合并

static void Main(string[] args)
        {
            MyDelegate myDelegate    =new MyDelegate(ProgramMothod);
            myDelegate();
            MyDelegate myDelegate1 = new MyDelegate(ProgramMothod1);
            myDelegate1();


            MyDelegate myDelegate2 = new MyDelegate(ProgramMothod);//
   //myDelegate2 多播

            /*
委托的多播
1.方法的类型相同
2.同时执行
3.委托对象利用+=方式 完成多播的使用   -=取消多播操作
*/
            myDelegate2 += ProgramMothod1;
            myDelegate2();
            myDelegate2 -= ProgramMothod1;
            myDelegate2();



                //Action 多播
                Action action;
                Action action1 =new Action(ProgramMothod);
                Action action2 = new Action(ProgramMothod1);
                action = action1;
                action += action2;


            Console.ReadKey();
        }

   
        delegate void MyDelegate();
        static void ProgramMothod() {

            Console.WriteLine("123");

        }
        static void ProgramMothod1()
        {
            Console.WriteLine("456");
        }
    }

使用委托作为方法的参数

internal class Program
    {
        static void Main(string[] args)
        {
            ProgramMothod_1(ProgramMothod_2);
            
            Console.ReadKey();
        }
        public static void ProgramMothod_1(Action action) { 
              
             action();
        }
        public static void ProgramMothod_2()
        {
            Console.WriteLine("11");
        }

事件

1.事件基于委托的,可以为任何一种委托提供一种发布\订阅机制。(类似委托多播)
2.使用event关键字将一个委托类型定义为事件  事件就是委托的一个对象

 internal class Program
    {
        static void Main(string[] args)
        {
            Heater  heater = new Heater();
            heater.BoilEvent += Heater1;  
            heater.BoilEvent += Heater2; //添加事件
 
            heater.BoilWater();//执行事件
        }
        
        public static void Heater1(int x) {
 
            Console.WriteLine("水已经{0}度了,可以用茶杯接水了",x);
 
        }
        public static void Heater2(int x)
        {
 
            Console.WriteLine("水已经{0}度了,可以用大桶接水了", x);
 
        }
    }
    //烧开水事件 类
    public class Heater
    {
        private int temperature;//水温
        public delegate void BoilHandle(int x);//声明关于事件的委托
        public event BoilHandle BoilEvent;//声明水要烧开的事件
        public void BoilWater()
        { //烧水的方法
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (temperature > 96)
                {
                    if (BoilEvent != null)
                    {
                        BoilEvent(temperature);
                    }
                }
            }
        }
 
    }

普通匿名函数

1.针对委托的使用

2.可以快捷的使委托实例化。
3.不建议再使用匿名函数,C#3.0后使用lambda表达式替代匿名函数

4.格式 : 委托对象 = delegate (){};

匿名函数的写法
:
 
class Program
    {
        delegate int MyDelegate(int a, int b);
        static void Main(string[] args)
        {
            MyDelegate md = delegate(int a, int b) { return a + b; };
            int sum = md(1,2);
            Console.WriteLine(sum);
        }
    }

lambda表达式

1.普通匿名函数的升级版本  (箭头函数)

2.比普通匿名函数更为简洁,数据类型可以不用写 

class Program
    {
        delegate int MyDelegate(int a, int b);
        static void Main(string[] args)
        {
            MyDelegate md = (a,b)=>{return a+b;};
            int sum = md(1, 2);
            Console.WriteLine(sum);

            
            //无参无返回值匿名函数
            Action action = () => { };


        }
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十七章 C# Action和Func委托 多播 匿名函数 lambda表达式 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp

随机推荐

  • 【Android QR Code】开源项目:ZXing(三)二维码解码

    继续上一节的内容 本节我们将对上一节的QQ群号二维码进行解码 QQ群号二维码图片另存为后 将下载的 jpg拷贝到项目assets目录下 1 解码配置 Map
  • 【已解决】使用Appium Inspector及uiautomatorviewer无法定位浮窗内元素

    1 问题描述 当开启一个应用的画中画模式时 将会调出浮窗 此时使用Appium Inspector及uiautomatorviewer均无法定位浮窗内元素 只能对浮窗底层的Activity进行元素定位 Appium Inspector ui
  • chatgpt的第一次尝试

    openai最近很火 火的公司的市场部门都已经用chatgpt来写市场方案和产品方案了 是市场部总监在一个公寓里住着 两人昨天交流了一些有关chatgpt的认识 在市场部的影响下 开始了chatgpt的第一次试用 我试用了2个主题 一个是有
  • OCR模型DBNet-------《Real-time Scene Text Detection with Differentiable Binarization》论文,模型,代码解剖

    首先 我先对DBNet的论文进行重点翻译解释说明 之后再对整个模型进行解剖 最后再对官方源码的实现方法 关键代码进行分析 所以篇幅也比较长 之间会附带一些例子说明 让你更深刻的了解DBNet 论文解析 Abstract 基于语义分割的文本检
  • 谷歌裁员1.2万,幸存员工崩溃哭泣

    1 月 20 日 谷歌母公司Alphabet首席执行官桑达尔 皮查伊宣布裁员 裁员人数相当于公司全球员工总数的 6 左右 1 2 万人 2022 2023 中国开发者大调查 重磅启动 欢迎扫描下方二维码 参与问卷调研 更有 iPad 等精美
  • 正常计算机的c盘空间多大,电脑C盘应该留多大空间?

    机械硬盘 不管是500G 1TB 2TB 4TB win7 还是win10系统统一60G就行 C盘大小为 60G 固态硬盘 两种情况 一种是120G 一种是240G及以上 120G硬盘 C盘为120G 整个硬盘为一个区 240硬盘及以上 C
  • 服务器配置openssl支持 https 访问

    一 Windows apache 下 软件是xampp 说明 部分参考 http blog sina com cn s blog 5d7dbbdd0101042n html 首先要载入 mod ssl 1 将证书生成的配置文件 http t
  • MFC---CComboBox控件添加字符串函数InsertString

    InsertString 在列表的指定位置插入一项 需使用成员函数InsertString 函数有两个参数 第一个参数为索引号 设定为 1时 项目条被插入到列表的末尾 第二个参数与AddString 函数的唯一参数相同 为代表项目条中内容的
  • python中字典考题_python 字典一些常见的魔法方法以及遇到的面试题

    一 字典介绍 dict 类型不但在各种程序里广泛使用 它也是 Python 语言的基石 模块的命名空间 实例的属性和函数的关键字参数中都可以看到字典的身影 跟它有关的内置函数都在 builtins dict 模块中 正是因为字典至关重要 P
  • 对标大厂标准,C站(CSDN)软件工程师能力认证正式上线

    2021年3月1日 中国专业IT开发者社区CSDN 以下简称C站 正式推出 C站软件工程师能力认证 该认证与国际标准接轨 面向全球IT开发者学习成长 同时具备标准全开源 系统化学习 真实业务场景 完全上机实操 所有过程留痕 存档不可篡改等特
  • 【Leetcode】61. 旋转链表

    题目描述 给你一个链表的头节点 head 旋转链表 将链表每个节点向右移动 k 个位置 题解 旋转链表 找倒数第k个节点 翻转前后链表 执行用时 0 ms 在所有 Java 提交中击败了100 00 的用户 内存消耗 37 8 MB 在所有
  • 重磅, GPT 4.0 API 全面开放使用!普通人也能用上 4.0 了 !

    伴随着人工智能领域的迅猛发展 GPT 4 0作为一款关键的智能模型 备受国内开发者和企业的瞩目 本文旨在为您提供详实的指南 帮助您在国内顺利获取并使用GPT 4 0 API 从而踏上智能应用创新之路 我们将为您提供一步一步的操作步骤和必要的
  • 【ts】数组、联合数据类型、类型推论

    一 ts约束数组 1变量 类型 let arr Number 1 3 3 4 arr push 1 arr push he 不能添加数组中没有约束的类型 2 数组泛型 变量 Array lt 类型 gt let arr Array
  • DasViewer加载大疆智图、CC等三维模型无空间坐标的解决方法

    对于大疆智图处理生成的terra osgbs文件夹下的三维模型包含了带有空间参数的metadata xml文件 利用DasViewer打开Model osgb模型文件 显示比较模糊 不能够达到实际应用的目的 我是利用转格式工具进行格式转换生
  • python 执行js脚本报错CryptoJS is not defined

    直接在js代码加上一行定义CryptoJS就行了 function encrypt e const CryptoJS require crypto js var b bGVhcm5zcGFjZWFlczEyMw var a new Base
  • 【Spring实战】—— 7 复杂集合类型的注入

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 之前讲解了Spring的基本类型和bean引用的注入 接下来学习一下复杂集合类型的注入 例如 List Set Map等 对于程序员来说 掌握多种语言是基本的技能 我们这里
  • 在本地以Docker方式安装和运行Kafka

    文章目录 在本地以Docker方式安装和运行Kafka 前言 用Bitnami kafka的镜像 用wurstmeister kafka的镜像 启动Kafka 测试创建主题并读 写消息 参考文档 后记 在本地以Docker方式安装和运行Ka
  • discuz7.2漏洞分析

    一 参数的入口 这段话的意思时遍历三种提交的方法 获取参数传递的值 有一个函数是daddslashes 跟进看一下 这段代码的意思是对数据里的每一个字符都进行转义处理 二 漏洞产生的代码在faq php195行 跟进implodeid函数
  • Tomcat安装测试、Eclipse配置Tomcat步骤

    一 安装tomcat并测试 1 1 1到Apache Tomcat官网下载安装包 在选择中间位置的版本较为稳定然后选择对应操作系统的安装包 本次选择8 5版本 1 1 2 解压下载好的安装包即可完成安装 复制Tomcat的安装路径以备下一步
  • 第十七章 C# Action和Func委托 多播 匿名函数 lambda表达式

    一 使用 Action和Func委托 方法的返回类型 和 名字千千万万 无法对每个方法都去定义对应的委托 nt为了方便使用委托 定义了两个泛型委托 Action Action委托表示一个void返回类型的方法 例1 MyDelegate m