调用带引用参数的委托

如果委托有引用参数,参数值会根据调用列表中的一个或多个方法的返回值而改变。
在调用委托列表中的下一个方法时,参数的新值(不是初始值)会传给下一个方法。例如,
如下代码调用了具有引用参数的委托。图14-11演示了这段代码。

delegate void MyDel(ref int X);class MyClass
{public void Add2(ref int x){x+=2;}public void Add3(ref int x){x+=3;}static void Main(){MyClass mc=new MyClass();MyDel mDel=mc.Add2;mDel+=mc.Add3;mDel+=mc.Add2;int x=5;mDel(ref x);Console.WriteLine($"Value:{x}")}
}

引用参数的值会在调用间发生改变

匿名方法

至此,我们已经介绍了使用静态方法或实例方法来实例化委托。在这种情况下,方法本身都
可以被代码的其他部分显式调用,当然,这个部分必须是某个类或结构的成员。
然而,如果方法只会被使用一次一一用来实例化委托会怎么样呢?在这种情况下,除了创建
委托的语法需要,没有必要创建独立的具名方法。匿名方法让我们无须使用独立的具名方法。
匿名万法(anonymousmethod)是在实例化委托时内联(inline)声明的方法。例如,图14-12
演示了同一个类的两个版本。左边的版本声明并使用了一个名为Add20的方法。右边的版本使用
了匿名方法。没有底色的代码部分对于两个版本是一样的。

比较具名方法和匿名方法

使用匿名方法

我们可以在如下地方使用匿名方法。

  • 声明委托变量时作为初始化表达式。
  • 组合委托时在赋值语句的右边。
  • 为委托增加事件时在赋值语句的右边。第15章会介绍事件。

匿名方法的语法

匿名方法表达式的语法包含如下组成部分。

  • delegate类型关键字。
  • 参数列表,如果语句块没有使用任何参数则可以省略。
  • 语句块,它包含了匿名方法的代码。

image

返回类型

匿名方法不会显式声明返回值。然而,实现代码本身的行为必须通过返回一个与委托的返回
类型相同的值来匹配委托的返回类型。如果委托有void类型的返回值,匿名方法就不能返回值。

例如,在如下代码中,委托的返回类型是int。因此匿名方法的实现代码也必须在代码路径
中返回int。

delegate int OtherDel(int Inparam);static void Main()
{OtherDel del=delegate(int x){return x+20;   //返回一个整数类型};
}

参数

除了数组参数,匿名方法的参数列表必须在如下3方面与委托匹配:

  • 参数数量;
  • 参数类型及位置;
  • 修饰符。
    可以通过使圆括号为空或省略圆括号来简化匿名方法的参数列表,但必须满足以下两个
    条件:
  • 委托的参数列表不包含任何out参数;
  • 若名方法不使用任何参数。
    例如,如下代码声明了一个没有任何out参数的委托,和一个没有使用任何参数的匿名方法。
    由于两个条件都满足了,所以可省略匿名方法的参数列表。
delegate void SomeDel(int X);   //声明委托类型
SomeDel SDel=delegate           //省略参数列表
{PrintMessage();CleanUp();
}

params参数

如果委托声明的参数列表包含了params参数,那么匿名方法的参数列表将忽略params关键
字。例如,在如下代码中:

  • 委托类型声明指定最后一个参数为params类型的参数;
  • 然而,匿名方法参数列表必须省略关键字。
//在委托类型声明中使用params关键字
delegate void SomeDel(int X,params int[] Y);//在匹配的匿名方法中省略关键字
SomeDel mDel =delegate(int X,int [] Y)
{...
};

变量和参数的作用域

参数以及声明在匿名方法内部的局部变量的作用域限制在实现代码的主体之内,如图14-13主
所示。

变量和参数的作用域

例如,上面的名方法定义了参数Y和局部变量z。在匿名方法主体结束之后,y和z就不
在作用域内了。最后一行代码将会产生编译错误。

外部变量

与委托的具名方法不同,匿名方法可以访问它们外围作用域的局部变量和环境。

  • 外围作用域的变量叫作外部变量(outervariable)。
  • 用在匿名方法实现代码中的外部变量称为被方法捕获。
    例如,图14-14中的代码演示了定义在匿名方法外部的变量×。然而,方法中的代码可以访
    问×并输出它的值。

使用外部变量

捕获变量的生命周期的扩展

只要捕获方法是委托的一部分,即使变量已经离开了作用域,捕获的外部变量也会一直有效。
例如,图14-15中的代码演示了被捕获变量的生命周期的扩展。

  • 局部变量x在块中声明和初始化。
  • 然后,委托mDel匿名方法初始化,该匿名方法捕获了外部变量x。
  • 块关闭时,x超出了作用域。
  • 如果取消块关闭之后的WriteLine语句的注释,就会产生编译错误,因为它引用的×现在
    已经离开了作用域。
  • 然而,mDel委托中的匿名方法在它的环境中保留了x,并在调用mDeI时输出了它的值。

在匿名方法中捕获的变量

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

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

相关文章

Cisco FMC events无法加载并且cpu high故障- Cisco bug

FMC故障 日志无法加载,并且CPU high 95% 经确认是bug问题,需要重置1个monetdb的进程 https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwe47671 https://bst.cloudapps.cisco.com/bugsearch/bug/CSCwi64429 2.1 备份FMC配置 2.2 重置进程 大约为2…

HarmonyOS 公共事件机制介绍以及多进程之间的通信实现(9000字详解)

HarmonyOS 公共事件机制介绍以及多进程之间的通信 CES(Common Event Service,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力 1. 公共事件的介绍 1.1.1公共事件的分类:公共事件从系统的角度可以分为系统公共事件和自定义公共事件 系统公共事件&#x…

华为云Flexus+DeepSeek征文|快速搭建Dify LLM应用开发平台教程

【摘要】本文介绍基于华为云Flexus X实例快速部署Dify-LLM应用开发平台的解决方案。通过创建云服务器(2核4G配置)、弹性公网IP(300Mbps带宽)及安全组,实现平台私有化部署。方案提供两种计费模式(按需197元/…

【blender】使用bpy对一个obj的不同mesh进行不同的材质贴图(涉及对bmesh的操作)

BMesh 简介 BMesh 是 Blender 中用于表示和操作网格数据的底层数据结构系统,它是传统网格数据结构的高级替代品。 主要特点 灵活拓扑支持: 支持 n-gons(任意边数的多边形),而不仅仅是三角形和四边形允许边和顶点不属…

如何通过nvm切换本地node环境详情教程(已装过node.js更改成nvm)

针对系统已装过node环境或者第一次安装nvm环境如何切换nvm 文章目录 系列文章目录前言一、删除原有node环境二、使用步骤 1.下载nvm软件2.安装node不同版本3.使用node版本4.配置包文件、安装包、配置包环境 总结 一、删除原有node环境 1、删除之前安装的node包,以及…

概率论符号和公式整理

本文是由AI生成后,经作者优化整理的文章。个人总结,仅限参考! 以下整理了概率论中的常用符号和公式表格,覆盖基础知识、关键定理和常用分布: 一、基础集合与事件符号 符号名称含义/公式说明 S S S样本空间所有可能结…

SpringSecurity是什么?

Spring Security是Spring生态中的安全框架,用于管理Web应用的认证与权限控制,支持多种登录方式并集成防护机制,可防范CSRF/XSS等攻击,保障企业级系统的安全性。 一、核心功能与定位 身份认证(Authentication&#xff…

nt!IoSynchronousPageWrite函数分析之atapi!IdeReadWrite----非常重要

第一部分:预分析 1: kd> g Breakpoint 7 hit atapi!IdeReadWrite: f729cb2a 55 push ebp 1: kd> kc # 00 atapi!IdeReadWrite 01 atapi!IdeSendCommand 02 atapi!AtapiStartIo 03 atapi!IdeStartIoSynchronized 04 nt!KeSynchronizeExecuti…

软考系统架构设计师经验总结

本文目的 对参加的2025年上半年系统架构设计师考试进行总结提供一些备考思路给未来参加系统架构设计师的同学 个人背景 工作背景 本科计算机与技术(学过一些计算机基础课程),15年毕业后从事过b端(人群画像、营销、用户增长、硬…

Tailwind CSS工作原理

文章目录 前言1. 指令解析与 AST 操作🚩 **核心处理流程**🧩 **具体流程说明** 2. **配置驱动的样式生成**3. **JIT 模式(Just-In-Time)的核心逻辑**4. **插件与自定义扩展**5. **与 PostCSS 管道的协同**6. **优化与 Tree Shakin…

web网页开发,在线%旅游景点管理%系统demo,基于Idea,vscode,html,css,vue,java,maven,springboot,mysql

经验心得 两业务单,都是业务逻辑开发,基本crud,什么是前后端,怎么分离前后端,前后端怎么通讯的,是以什么格式进行通讯这些咱们都需要掌握,后面剩下就是前后端不同层如何优化。管理系统很常见了其…

面试150 长度最小的子数组

思路 联想到滑动窗口法。左窗口的值为0,遍历数组对数组求和,当数组的和大于等于target的时候,窗口要收缩,计算子数组的长度,并及时更新最小的长度,左窗口右移。 class Solution:def minSubArrayLen(self,…

Python字典的查询操作

一、前言 在 Python 中,字典(dict) 是一种非常常用的数据结构,以键值对(Key-Value Pair)形式存储数据,支持快速查找、插入和删除操作。 本文将系统性地介绍 Python 字典中常见的查询操作方法&…

pyhton基础【18】面向对象基础一

目录 一.面向对象 二.面向对象概述 三.类与对象 一.面向对象 Python中的面向对象编程OOP是一种编程范式,它使用对象来设计软件。对象是具有属性(称为属性)和可以执行的操作(称为方法)的数据结构。 基础概念 类:class 类是创建对象的蓝图或模板。它…

Requests源码分析:面试考察角度自验(初级)

简单描述执行流程 Q:能简单描述一下发送一个requests.get(url)请求时,在requests库内部的主要执行流程吗?(从调用get方法到收到响应) 入口委托: get() 方法内部调用 requests.request(GET, url)。Session 接管: request() 方法会获取或隐式创建一个 Session 对象,并调用…

鸿蒙5:条件-循环-列表渲染

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

浅谈AI大模型-MCP

MCP简介 MCP(Model Context Protocol,模型上下文协议 ),24年11月初的时候Anthropic发了一篇技术博客,推出了他们的模型上下文协议MCP,介绍了一种规范:应用如何为LLM提供上下文。官网称MCP为AI应…

MySQL数据库基础概述

前言: MySQL作为全球应用最广泛的开源关系型数据库管理系统(RDBMS)​,凭借其高性能、高可靠性与零成本特性,已成为Web应用、企业系统的核心数据引擎。它遵循SQL标准,通过表结构实现数据的结构化存储&#x…

桌面小屏幕实战课程:DesktopScreen 16 HTTP

飞书文档http://https://x509p6c8to.feishu.cn/docx/doxcnrxBs55qGn6xoysTcJpqwRf /home/kemp/work/esp/esp-idf/examples/protocols/http_request 源码下载方式参考: 源码下载方式 心知天气 注册账号,申请产品,获取密钥 产品 天气数据 H…

vs2019 + QT下 vs2019创建的项目打开ui文件失败

问题: 在vs2019 QT模式下。使用2019创建工程后。点击ui文件打开时。出现奔溃,如下图 解决方式: ui文件->右键->打开方式->添加->程序->点击三个点->qcreator(qt安装目录) ->设置为默认值->确定 点击设置为默认值,点…