匿名方法

与前面的可空类型是一样的,匿名方法也是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,一经查实,立即删除!

相关文章

使用React,Redux和Router进行真正的集成测试

by Marcelo Lotif通过马塞洛洛蒂夫(Marcelo Lotif) 使用React&#xff0c;Redux和Router进行真正的集成测试 (Real integration tests with React, Redux and Router) After being bitten a couple of times by bad refactoring and a broken app — even with all my tests…

Go语言从入门到精通 - 数据类型转换

本节核心内容 介绍 Go语言数据类型转换的格式介绍 数据转换代码示例介绍 数据转换过程中的注意事项 本小节视频教程和代码&#xff1a;百度网盘 可先下载视频和源码到本地&#xff0c;边看视频边结合源码理解后续内容&#xff0c;边学边练。 Go语言数据类型转换 Go 语言使用类型…

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…

signature=f7a4b29b93ef2b36608792fdef7f454a,Embedding of image authentication signatures

摘要&#xff1a;A method (), an apparatus, a computer readable medium and use of said method for authenticating an audio-visual signal (), such as a digital image or video, are disclosed. A signature is derived from all image regions, including areas with …

glob

主要是用来在匹配文件&#xff0c;相当shell中用通配符匹配. 用法: glob.glob(pathname) # 返回匹配的文件作为一个列表返回 glob.iglob(pathname) # 匹配到的文件名&#xff0c;返回一个迭代器 ps: pathname是路径, 可以是绝对和相对路径 匹配当前目录下有一个数字开头…

构建微服务:Spring boot 入门篇

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

img 加载 svg占位符_如何使用SVG作为占位符以及其他图像加载技术

img 加载 svg占位符by Jos M. Prez由JosM.Prez 如何使用SVG作为占位符以及其他图像加载技术 (How to use SVG as a Placeholder, and Other Image Loading Techniques) I’m passionate about image performance optimisation and making images load fast on the web. One of…

hibernate 注解

参考链接地址&#xff1a;https://blog.csdn.net/wx5040257/article/details/78697119 主键生成策略:https://www.cnblogs.com/ph123/p/5692194.html 注解转载于:https://www.cnblogs.com/wangxuekui/p/10287647.html

iOS - UIScrollView

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

机器学习的展望

现阶段越来越多的投入到机器学习的热潮中来&#xff0c;有的人很是兴奋&#xff0c;认为这是一场新和革命&#xff0c;一场终极人工智能来临的前夜。也有人表示悲观&#xff0c;认为不仅机器学习不代表终极人工智能&#xff0c; 也还非常不成熟。 大量的新生代投入到这个领域&a…

BZOJ3453 XLkxc(拉格朗日插值)

显然f(i)是一个k2项式&#xff0c;g(x)是f(i)的前缀和&#xff0c;则显然其是k3项式&#xff0c;插值即可。最后要求的东西大胆猜想是个k4项式继续插值就做完了。注意2p>maxint…… #include<iostream> #include<cstdio> #include<cmath> #include<cs…

电邮地址_利用这些简单的技巧来充分利用电子邮件的强大功能

电邮地址Let’s talk about some email features that are surprisingly under-used, and that can really benefit you — if you know how to use them. This article is suitable for both users and developers who want to become email Jedi.让我们讨论一些电子邮件功能&…

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

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

html5语义化 兼容,HTML5语义化标签,兼容性问题

HTML5不仅仅作为HTML标记语言的一个最新版本&#xff0c;更重要的是它制定了web应用开发的一系列标准&#xff0c;成为第一个将web做为应用开发平台的HTML语言。HTML5定义了一系列的新元素&#xff0c;如新语义化标签&#xff0c;智能表单&#xff0c;多媒体标签等&#xff0c;…

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

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

如何使用json开发web_如何通过使用JSON Web令牌简化应用程序的身份验证

如何使用json开发webby Sudheesh Shetty由Sudheesh Shetty 如何通过使用JSON Web令牌简化应用程序的身份验证 (How to simplify your app’s authentication by using JSON Web Token) Every application we come across today implements security measures so that the user…

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次可能的最优解。所以我们只要把这两个数组做比较…

html自动按键,VBS脚本和HTML DOM自动操作网页

本来是想通过JS实现对其他页面的控制&#xff0c;发现跨域无法获取页面DOM来操作。接着考虑bat&#xff0c;发现也实现不了&#xff0c;于是想到vbs。vbs还是很强大啊&#xff0c;病毒之类很多都是vbs脚本啊。vbs打开浏览器&#xff0c;然后通过dom来操作页面&#xff0c;可以实…

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

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