匿名方法

与前面的可空类型是一样的,匿名方法也是C# 2.0里面提出来的。

1 匿名方法

   1.1 什么是匿名方法?

        顾名思义,就是没有名称的方法,因为没有名称,匿名方法只能在函数定义(匿名方法是把方法的实现和定义嵌套在了一起)的时候被调用,在其他任何情况下都不能被调用。对于编译器来说,匿名方法并不是没有名字的,编译器在编译匿名方法时会为其生成一个方法名,下面可以通过IL代码来证明。

   

 1 namespace 匿名方法
 2 {
 3     class Program
 4     {
 5         private delegate void VoteDelegate(string name);
 6         static void Main(string[] args)
 7         {
 8             //使用匿名方法来实例化委托对象
 9             VoteDelegate voteDelegate = delegate(string name)
10             {
11                 Console.WriteLine("昵称为:{0} 来帮我提高啦",name);
12             };
13             //通过调用委托来回调Vote方法,这是隐式调用方式
14             voteDelegate("Hong");
15             Console.ReadKey();
16         }
17     }
18 }

    从以上的代码可以看出,委托对象可用匿名方法来实例化的。当并不能一概而论,匿名方法也有它本身的缺点——不能在其他地方被调用,即不具有复用性。而且,匿名方法会自动形成“闭包”。当一个函数(这里成为外部函数)包含对另一个函数(内部函数)的调用时,或当内部函数使用了外部函数的变量时,都会形成闭包。闭包可能会延长外部变量的生命周期。所以如果委托包装的方法相对简单,并且该方法在其他地方的调用频率较低,你就可以考虑用匿名方法来实例化委托对象。

    

    1.2 对变量捕捉过程的剖析

         变量被匿名方法捕获后,变量的生命周期会被延长,就是说对于一个被捕获的变量而言,只要还有任何委托实例在引用它,它就一直存在,就不会在部分委托实例调用结束后被垃圾回收释放掉。下面通过代码来解释:

 1 class Program
 2     {
 3         private delegate void ClosureDelegate();
 4         static void Main(string[] args)
 5         {
 6             ClosureDelegate test = CreateDelegateInstance();
 7             test();
 8             Console.ReadKey();
 9         }
10 
11         private static ClosureDelegate CreateDelegateInstance()
12         {
13             //外部变量
14             int count = 1;
15             ClosureDelegate closureDelegate = delegate()
16             {
17                 Console.WriteLine(count);
18                 count++;
19             };
20             closureDelegate();
21             return closureDelegate;
22         }
23     }

结果:

    我并不知道大家对这个结果是否感到惊讶,第一次输出1是正常的,但第二个输出2确实比较奇妙的。大家可能会认为应该抛出异常才对,因为count在栈上的生命周期已经结束。但结果确实是输出2,是不会错的,我们可以倒推原因,使用匿名方法时,编译器会创建一个额外的类来容纳变量,此时count变量会被分配到堆上的。CreateDelegateInstance方法有该类的一个实例引用,所以此时匿名方法捕捉到的是变量count的一个引用,而不是真真的值。在这个过程中,匿名方法延长了变量count的生命周期。

    对于匿名方法捕捉到的变量,编译器会额外创建一个类来容纳它们。

    

    由上图可知,我们并没有在源码中定义<>c_DisplayClass2_0类。这个类就是编译器创建来容纳捕获的变量count的,该类还容纳了CreateDelegateInstance的方法。

转载于:https://www.cnblogs.com/Helius/p/5751435.html

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

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

相关文章

JNI通过线程c回调java层的函数

1、参看博客&#xff1a;http://www.jianshu.com/p/e576c7e1c403 Android JNI 篇 - JNI回调的三种方法&#xff08;精华篇&#xff09; 2、参看博客&#xff1a; JNI层线程回调Java函数关键点及示例 http://blog.csdn.net/fu_shuwu/article/details/41121741 3 http://blog.cs…

构建微服务:Spring boot 入门篇

Spring官方网站本身使用Spring框架开发&#xff0c;随着功能以及业务逻辑的日益复杂&#xff0c;应用伴随着大量的XML配置文件以及复杂的Bean依赖关系。随着Spring 3.0的发布&#xff0c;Spring IO团队逐渐开始摆脱XML配置文件&#xff0c;并且在开发过程中大量使用“约定优先配…

iOS - UIScrollView

前言 NS_CLASS_AVAILABLE_IOS(2_0) interface UIScrollView : UIView <NSCoding>available(iOS 2.0, *) public class UIScrollView : UIView, NSCoding 移动设备的屏幕大小是极其有限的&#xff0c;因此直接展示在用户眼前的内容也相当有限。当展示的内容较多&…

inputstream重新赋值之前需要close吗_变量提升真的搞懂了吗?打脸的一道题

变量提升真的搞懂了吗&#xff1f;打脸的一道题我们知道JS代码在执行之前&#xff0c;会做一系列的事情&#xff0c;其中就包括变量提升&#xff0c;原本以为把变量提升搞懂的我&#xff08;因为这两天一直在研究变量提升&#xff0c;自我感觉已经很良好了&#xff0c;哈哈哈&a…

Swift之 vm10虚拟机安装Mac OS X10.10教程

VM10装Mac OS X 10.9.3及更新到Mac OS X 10.10,让你的windows也能玩Swift 。 近期WWDC放出终极大招——新的编程语言Swift(雨燕),导致一大波程序猿的围观和跃跃欲试。当然了,工欲善其事,必先利其器,所以对于那些没有Mac又想要尝鲜的小伙伴肯定非常为难。可是&#xff0c;请放…

c++ 实现录音并且指定到文件_通话自动录音,留下美好回忆,记录完整录音证据...

手机通话&#xff0c;如果自动录音多好&#xff0c;许多人与我一样抱有这个想法。记得华为Android版本5.0时代&#xff0c;手机没有自动录音功能&#xff0c;我一直到网上下载自动通话录音软件&#xff0c;有时甚至是下载ROOT版的带自动通话功能的EMUI版本进行刷机安装。那个时…

2639-Bone Collector II (01背包之第k优解)

题目链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid2639 求第k优解的关键代码&#xff1a; 用两个数组记录两种状态&#xff08;选择或不选择&#xff09;&#xff0c;并且只要记录前k次。在这两个数组中都是前k次可能的最优解。所以我们只要把这两个数组做比较…

opencv在同一窗口打印多张图片

首先&#xff0c;由于cv2处理的图片是通过ndarray的格式操作的&#xff0c;也就是说通过array的拼接就可以实现图片的拼接&#xff0c;那么之后就可以通过简单的imshow将合并的图片打印从而达到在一个窗口中显示多张图片的目的。 import cv2 import numpy as npimg1 cv2.imrea…

dj打碟怎么学_学DJ打碟 - Rane声卡连接

上一篇内容中&#xff0c;老师讲过在学DJ打碟的时候&#xff0c;是离不开对软件方面的操作&#xff0c;其实每一个学习过程&#xff0c;当你学会之后&#xff0c;在“回头看”的时候&#xff0c;都会觉得&#xff1a;原来学DJ打碟这么简单啊&#xff0c;这就是已经学习过的人会…

微信企业号第三方应用开发[一]——创建套件

注&#xff1a;文中绿色部分为摘自微信官方文档 第三方应用提供给企业的是一个应用&#xff0c;但是应用必须在套件下创建&#xff0c;所以第一步是要创建套件。 注册成为应用提供商&#xff0c;必须输入以下信息&#xff1a; 信息项要求及说明企业Logo应用提供商的企业Logo&am…

html原生上传,一个基于HTML5及原生JS的文件上传组件--JohnUploader

运行效果图一、组件介绍基本特点基于HTML5的FileReader和FormData可以完成多文件选择&#xff0c;并预览完成文件的异步上传原生XHR对象&#xff0c;适配多浏览器代码class JohnUploader{url;fileField;vollay;/**** param url 文件上传的地址* param fileField 一个"文件…

微信企业号第三方应用开发[二]——创建应用

在应用套件里添加应用 当你创建完应用套件后&#xff0c;需要在套件配置应用&#xff0c;应用的信息填写如下。 基本信息&#xff1a; 信息项要求及说明应用Logo应用的Logo&#xff0c;小于2M&#xff0c;640*640&#xff0c;在授权页会被用于展示。应用名称应用的名称&#xf…

jQ效果:简单的手风琴效果

实现效果如图所示&#xff1a; html结构&#xff1a; <div class"item_box box10"><div class"item_box_wp"><div class"voice_2"><ul><li class"li1" id"li1"><div class"fold"…

golang 日志分析_容器日志采集利器:Filebeat深度剖析与实践

在云原生时代和容器化浪潮中&#xff0c;容器的日志采集是一个看起来不起眼却又无法忽视的重要议题。对于容器日志采集我们常用的工具有filebeat和fluentd&#xff0c;两者对比各有优劣&#xff0c;相比基于ruby的fluentd&#xff0c;考虑到可定制性&#xff0c;我们一般默认选…

java ldap userpassword 解密_Spring Boot中使用LDAP来统一管理用户信息

LDAP简介LDAP(轻量级目录访问协议&#xff0c;Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。目录服务是一种特殊的数据库系统&#xff0c;其专门针对读取&#xff0c;浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的&#xff0c;基于…

unity中怎么做河流_【干货】工作中怎么做工业设计的?(一)

最近在找工作&#xff0c;一直在看招聘信息。看到工业设计工资还是蛮高的。应届毕业生一般是4-6K&#xff0c;1-3年工作经验是6-8K&#xff0c;3年以后的差不多是8K以上了。我没有嫉妒羡慕恨&#xff0c;发誓&#xff0c;真的没有。工业设计已经被重视&#xff0c;未来的道路会…

[易学易懂系列|golang语言|零基础|快速入门|(一)]

golang编程语言&#xff0c;是google推出的一门语言。 主要应用在系统编程和高性能服务器编程&#xff0c;有广大的市场前景&#xff0c;目前整个生态也越来越强大&#xff0c;未来可能在企业应用和人工智能等领域占有越来越重要的地位。 本文章是【易学易懂系列|编程语言入门】…

spi收发时的寄存器sr不变_「正点原子Linux连载」第二十七章SPI实验(二)

1)实验平台&#xff1a;正点原子Linux开发板2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》关注官方微信号公众号&#xff0c;获取更多资料&#xff1a;正点原子文件bsp_spi.c中有两个函数&#xff1a;spi_init和spich0_readwrite_byte&#xff0c;函数spi_init是SPI初始化函…

[JSOI2018]潜入行动

题解 一道思路不难但是写起来很麻烦的树形背包 我们发现每个节点有很多信息需要保留 所以就暴力的设\(f[u][j][0/1][0/1]\)表示点u的子树分配了j个监察器,点u有没有被控制,点u放没放监察器 然后就分四种情况暴力讨论就好了 注意背包的时候要卡常数 代码 #include<cstdio>…

css。元素样式、边框样式

1.外边距  margin 缩写形式&#xff1a; margin&#xff1a;上边距  右边距  下边距  左边距 margin&#xff1a;上下边距  左右边距 margin&#xff1a;上边距  左右边距  下边距 2.内边距  padding 缩写形式&#xff1a; padding&#xff1a;上边距  右边距…