C# lambda 表达式 和 闭包的概念

目录

lambda表达式


闭包

 内层的函数可以引用包含在它外层的函数的变量
 即使外层函数的执行已经终止
 注意:

 该变量提供的值并非变量创建时的值,而是在父函数范围内的最终值。

class Program
    {
    public static void Main()
    {
       Test test = new Test();
        test.DoSomeThing();    //输出10 20
        test .DoSomeThing();   //输出20 30

这两次输出不同证明了事件中存的匿名函数中的vlue是存的成员变量value的地址 

因为第一次test.doSomeTing();value地址中的值是10第二个匿名方法把value地址中的值改为了20

第二次执行事件中的两个匿名函数时,第一个匿名函数执行时value的值变为了20 所以输出20 第二个匿名函数value地址中存的值变为了30所以输出30


    }
    }
class Test
{
    public event Action action;
    public Test() 
    {
        int value = 10;
        //这里就形成了闭包
        //因为 当构造函数执行完毕时 其中申明的临时变量value的生命周期被改变了
        action = () =>
        {
            Console .WriteLine (value);
        };
        action += () => 
        {
            value += 10;
            Console.WriteLine (value);
        };
                              
    }                                  
                                       
    public void DoSomeThing()          
    { 
        action(); 
    }
}


一个例子

class Program{public static void Main(){Test test = new Test();test.DoSomeThing();    }}
class Test
{public event Action action;public Test() {for (int i = 0; i < 10; i++){action += () =>{Console.WriteLine(i); //这里为什么打印出来10个10;而不是0~9};                        //因为存这个函数的时候Test这个构造函数还没执行完//i的值一直在+1+1,而函数中存的是i的地址}                             //等存的函数开始执行的时候 i的地址里就是10了//就打印了10个10}                                public void DoSomeThing()          { action(); }
}

再来一个

class Program{public static void Main(){Test test = new Test();test.Fun()();}}
class Test
{public event Action action;public Action   Fun() {for (int i = 1; i <=10; i++){int a = i;action += () =>{Console.WriteLine(a);};}return action;                }                                  }

这里打印1 2 3 4 5 6 7 8 9 10


lambda表达式


            //可以将lambad表达式 理解为匿名函数的简写
            //它除了写法不同外
            //使用上和匿名函数一模一样
            //都是和委托或者事件 配合使用的

lambad表达式语法


            匿名函数
            delegate (参数列表)
            {

            };

            lambad表达式
            (参数列表) =>
            {
                函数体
            };

使用
            //1.无参无返回
            Action a = () =>
            {
                Console.WriteLine("无参无返回值的lambad表达式");
            };
            a();
            //2.有参
            Action<int> a2 = (int value) =>
            {
                Console.WriteLine("有参数Lambad表达式{0}", value);
            };
            a2(100);

            //3.甚至参数类型都可以省略 参数类型和委托或事件容器一致
            Action<int> a3 = (value) =>
            {
                Console.WriteLine("省略参数类型的写法{0}", value);
            };
            a3(200);
            //4.有返回值
            Func<string, int> a4 = (value) =>
            {
                Console.WriteLine("有返回值有参数的那么大表达式{0}", value);
                return 1;
            };
            Console.WriteLine(a4("123123"));

            //其它传参使用等和匿名函数一样
            //缺点也是和匿名函数一样的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/877965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙HarmonyOS开发:创建新的Lite工程

当开始开发一个应用/服务时&#xff0c;首先需要根据工程创建向导&#xff0c;创建一个新的工程&#xff0c;工具会自动生成对应的代码和资源模板。 说明 在运行DevEco Studio工程时&#xff0c;建议每一个运行窗口有2GB以上的可用内存空间。 创建和配置新工程 DevEco Studio提…

Kubernetes中如何对etcd进行备份和还原

一、etcd备份 准备环境 确认etcd版本&#xff0c;确保etcdctl客户端与服务器版本兼容。获取etcd证书和密钥&#xff0c;如果集群使用了TLS加密。设置etcdctl环境变量&#xff0c;如ETCDCTL_API3&#xff08;指定使用etcd v3 API&#xff09;。 执行备份命令 使用etcdctl的snap…

TCP/IP和SNMP

目录 前言 一、TCP/IP (Transmission Control Protocol/Internet Protocol) 1. TCP/IP概述 2. TCP/IP的分层结构 3. TCP和UDP的对比 4. IP地址和子网划分 二、SNMP (Simple Network Management Protocol) 1. SNMP概述 2. SNMP的组成部分 3. SNMP操作 4. SNMP版本 5…

【图文并茂】ant design pro 如何对接后端个人信息接口

上一节我们有讲到如何对接登录接口的 【图文并茂】ant design pro 如何对接登录接口 仅仅能登录是最基本的&#xff0c;但是我们要进入后台还是需要另一个接口。 这个接口有两个作用&#xff1a; 来获取当前登录账号的信息&#xff0c;比如头像&#xff0c;用户名&#xff0…

Springsecurity中的Eureka报错:Cannot execute request on any known server

完整报错信息&#xff1a; com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 报错体现&#xff1a; 访问eureka控制面板&#xff1a; 访问测试地址&#xff1a; 控制台报错&#xff1a; 可能的报错原因&#xff…

【YOLOv8改进[Conv]】 感受野注意力卷积RFAConv(2024.3)| 使用RFAConv改进C2f + 含全部代码和详细修改方式

本文将进行在YOLOv8中使用 感受野注意力卷积RFAConv改进C2f 的实践,助力YOLOv8目标检测效果,文中含全部代码、详细修改方式。助您轻松理解改进的方法。 改进前和改进后

Java的GC(Garbage Collection,垃圾回收)

Java的GC&#xff08;Garbage Collection&#xff0c;垃圾回收&#xff09;机制是Java虚拟机&#xff08;JVM&#xff09;中的一个重要功能&#xff0c;用于自动管理堆内存中不再使用的对象&#xff0c;释放其占用的内存空间&#xff0c;以避免内存泄漏和溢出。以下是对Java GC…

WEB渗透免杀篇-Golang免杀

全套完整笔记 渗透测试60w字全套md笔记&#xff1a;夸克网盘分享 往期文章 WEB渗透免杀篇-免杀工具全集-CSDN博客 WEB渗透免杀篇-加载器免杀-CSDN博客 WEB渗透免杀篇-分块免杀-CSDN博客 WEB渗透免杀篇-Powershell免杀-CSDN博客 WEB渗透免杀篇-Python源码免杀-CSDN博客 …

快手小店自动回复机器人脚本

快手小店自动回复机器人是一种利用人工智能AI技术&#xff0c;能够根据用户的会话咨询内容自动回复的工具。这种机器人可以帮助快手小店主快速、高效地回复客户消息&#xff0c;提升店铺的客户服务质量和销售效率。 甜羊浏览器是一款基于Chromium内核开发的国产浏览器&#xff…

wpf DynamicResource的ResourceKey值进行绑定

wpf 中的DynamicResource 的ResourceKey不支持绑定的&#xff0c;因为它不是个DependencyProperty&#xff0c;但又想动态指定ResourceKey 场景&#xff1a; Name属性有多个值 zhangsan,lisi,wangwu 对应不同资源文件中的 // style1<sys:String x:Key"zhangsan"…

Java里面的::是什么意思

在Java中&#xff0c;:: 是方法引用&#xff08;Method References&#xff09;的符号。方法引用提供了一种更简洁的方式来引用已存在的方法或构造函数。这种特性是在Java 8中引入的&#xff0c;作为Lambda表达式的一个补充&#xff0c;旨在让代码更加简洁和易于理解。 方法引…

解决html中文乱码问题

在head上面添加 <% page contentType"text/html;charsetUTF-8" language"java" %>

怎么写spring security的账号密码成功失败处理器并且加一个验证码过滤器

spring security他是自带一个页面的,如果我们没有页面的话,他会进行一个账号密码的校验,成功就会走成功的处理器,失败就会走失败的处理器 成功处理器 package com.lzy.security;import cn.hutool.json.JSONUtil; import com.lzy.common.lang.Result; import org.springframew…

大模型之二十六-Diffusion model实例浅析

在2022年&#xff0c;midjourney、DALL-E以及Stable Diffusion三个文生图模型引爆了机器生产文生图领域&#xff0c;他们的模型能够在可控条件&#xff08;标签、文本描述&#xff09;下生成高分辨率、细节丰富的多样性图像&#xff0c;这在视觉上往往难以与真实图像区分。本文…

python 实现 hidden layers neural network浅层神经网络算法

hidden layers neural network浅层神经网络算法介绍 浅层神经网络&#xff08;Shallow Neural Network&#xff09;&#xff0c;也称为单隐层神经网络&#xff08;a single hidden layer neural network&#xff09;&#xff0c;是一种包含输入层、一个隐藏层和输出层的神经网…

SAP Document Splitting

SAP系统中的文档分割&#xff08;Document Splitting&#xff09;是一个用于在财务会计模块中进行更细粒度的财务报表分析的技术。它允许按照不同的标准&#xff08;如成本中心、利润中心、公司代码等&#xff09;对会计凭证进行详细记录和报表展示。文档分割的主要目标是提高财…

前沿重器[55] | prompt综述的解释和个人思考

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

幅频特性曲线分析及使用WPF绘制

文章目录 1、一阶惯性环节的幅频特性曲线分析及绘制2、二阶系统的幅频特性曲线分析及绘制3、一般的系统4、上位机代码实现4.1 一阶惯性系统4.2 二阶系统 5、稳定裕度5.1 幅值裕度5.2 相角裕度 参考 1、一阶惯性环节的幅频特性曲线分析及绘制 这里的a和b可以根据系统的不同修改,…

2000-2023年上市公司财务困境RLPM模型数据(含原始数据+计算结果)

2000-2023年上市公司财务困境RLPM模型数据&#xff08;含原始数据计算结果&#xff09; 1、时间&#xff1a;2000-2023年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;证券代码、证券简称、统计截止日期、是否剔除ST或*ST或PT股、是否剔除上市不满一年、已经退市或…

三,接口分类

三&#xff0c;接口分类 接口根据来源可以大致分为两大类&#xff1a;内部接口和外部接口。这种分类方式主要关注于接口的使用场景和目的。 一、内部接口 内部接口主要指的是在程序内部或系统内部使用的接口&#xff0c;它们通常用于方法与方法之间、模块与模块之间的交互和…