关于Lambda和 匿名函数,闭包的GC,其实可以总结为两条。

为了方便理解,以举例说明,首先我们定义变量,静态变量,以及函数如下:

    static int staticVariable = 0;int variable = 0;private void Func(Action callback){}private void StaticFunc(Action callback){}private void Callback(){}private void Callback2(){variable++;}private static void StaticCallback(){staticVariable++;}

总结1:若是一个匿名函数引用到外部变量,则会造成一个闭包,C#为了实现这一点会生成一个匿名类(记住,类都是引用类型)来保存用到的外部变量,因此当调用这个闭包时,首先会实例化一个副本,同时会采用外部变量实际值来初始化这个副本,最终致使会在堆上分配内存。也就是说闭包就一定会产生内存分配

总结2: 在C#中全部方法的引用都是引用类型,都会被分配到堆中。把一个方法做为参数传递时,都会产生临时的内存分配,无论传递的是匿名方法还是已经定义的方法。

网上有的文章是这么写的,但是实际上,红色这句话应该是错误的,当传递的是已经定义的方法时,是一定会产生内存分配,当传递的是匿名方法时,要看该匿名方法是否是闭包

例如:

    void Update(){//传递的是已经定义的方法,有内存分配Func(Callback);//传递的是已经定义的方法,虽然是静态函数,也有内存分配Func(StaticCallback);//传递的匿名方法,由于是静态函数不是闭包,无内存分配Func(() => StaticCallback());//传递的匿名方法,由于是静态变量不是闭包,无内存分配Func(() =>{staticVariable++;});//传递的匿名方法,由于是静态函数不是闭包,无内存分配Func(() =>{StaticCallback();});//传递的匿名方法,由于是普通成员函数是闭包,有内存分配Func(() => Callback());//传递的匿名方法,不是闭包,无内存分配Func(() =>{int i = 0;i++;});//传递的匿名方法,是闭包,有内存分配Func(() =>{variable++;});}

更进一步测试:

public Action test;void Update(){//是閉包,有内存分配test = () =>{variable++;};//传递的是函数名,有内存分配test = Callback;//传递的是函数名,有内存分配test = Callback2;//传递的是函数名,有内存分配test = StaticCallback;//传递的是匿名函数,不是闭包,无内存分配test = () => { };//传递的是匿名函数,不是闭包,无内存分配test = () => { StaticCallback(); };}

因此:

1) 尽量避免将方法作为参数传递,如果无法避免,优先采用匿名方法,且尽量不要产生闭包,比如可以将所需的外部变量传入而不是直接应用

2)尽量避免使用闭包,如果无法避免,绝对不能每帧执行的函数中使用闭包

C# Lambda 和 匿名函数的GC总结相关推荐

  1. 《Python数据科学指南》——1.16 使用lambda创造匿名函数

    本节书摘来自异步社区<Python数据科学指南>一书中的第1章,第1.16节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区"异 ...

  2. C# 3.0通过Linq、Lambda、匿名函数、代理函数实现数据查询

    这几天,正在学习Linq.Lambda,做了些实验,通过Linq.Lambda.匿名函数.代理函数4种方式实现一个简单的查询,把实现结果记录一下,以免忘记.       这段代码中有一个Person类 ...

  3. 技术图文:Python 匿名函数 VS. C# Lambda表达式

    背景 前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结. 这是第 2 篇,从定义和应用两个角度来对比 Python 的匿名函数 与 C# 的La ...

  4. 14_python基础—匿名函数lambda表达式

    文章目录 一.lambda 表达式 1.1 lambda的应用场景 1.2 lambda语法 快速入门 1.3 示例:计算a + b 1.3.1 函数实现 1.3.2 lambda实现 1.4 lam ...

  5. c++11 lambda(匿名函数)

    #include <iostream> #include <functional> using namespace std::placeholders; //lambda即匿名 ...

  6. 【Kotlin】Kotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )

    文章目录 一.函数头声明 二.函数参数 1.默认参数值 2.具名参数 三.Unit 函数 四.TODO 函数抛出异常返回 Nothing 类型 五.反引号函数名 六.匿名函数 七.匿名函数的函数类型 ...

  7. python匿名函数的作用_Python匿名函数 Lambda表达式作用

    在Python这门优美的编程语言中,支持一种有趣的语法格式(表达式),可以让我们在单行内创建一个最小的函数-python lambda匿名函数. 据说是借鉴了Lisp语言中lambda表达式,它可以使 ...

  8. python匿名函数--lambda函数

    一.概念介绍 匿名函数:是指一类无需定义标识符(函数名)的函数或子程序 关键字lambda表示匿名函数,冒号前面的n表示函数参数,可以有多个参数. 匿名函数有个限制,就是只能有一个表达式,不用写ret ...

  9. lambda匿名函数

    lambda匿名函数 1. lambda是匿名函数,但是可以命名,名字在等号左边 2. lambda中只能包含一个表达式,不能包含复合语句 语法: <函数名> = lambda <参 ...

最新文章

  1. python3.8.5怎么用-Python 3.8.5 正式发布
  2. SQLServer 2005新功能
  3. LeetCode 424. 替换后的最长重复字符(双指针+滑动窗口)
  4. 架构师成长之旅_第一篇:插件与框架是什么?
  5. LINUX下载编译libffi
  6. 黑马程序员全套Java教程_Java基础入门视频教程零基础自学Java必备教程视频讲义(3)
  7. Linux文件系统格式EXT3,EXT4和XFS的区别
  8. 500G JAVA视频网盘分享 (JEECG开源社区)
  9. PHP生成一寸照片代码,用PS制作1寸证件照方法介绍
  10. 现浇板用弹性计算方法_弹性楼板的计算和选择
  11. WiFi密码破解亦或是WiFi热点软件?
  12. 推荐几个常用常玩的小游戏网址包括4399.com
  13. 今天在淘宝网购物,保证你省钱!又见系统升级Bug?(看图片)
  14. k武装匪徒强化学习入门课
  15. MySQL数据库————MVCC
  16. oracle数据结构体
  17. 运行金蝶KIS记账王V10.0对系统有什么要求
  18. 掌握并理解 CORS (跨域资源共享)
  19. 免费网站空间申请地址
  20. nacos文件解析错误:org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException

热门文章

  1. id nfc模拟_手机NFC也可以刷ID卡门禁?无聊测试居然成功了
  2. mysql 复制 二进制文件命令_Mysql中复制详细解析
  3. 查看虚拟机cpu型号_虚拟机管理器(Virtual Machine Manager)简介 | Linux 中国
  4. ehcache 缓存java对象_Ehcache 整合Spring 使用页面、对象缓存
  5. 大学物理实验试卷1到8_试卷赠送199:七年级秋季学期期中检测地理试卷及答案...
  6. php获取dropzone上传的文件,php - 如何上传文件,使用php中的dropzone将文件详细信息保存到mysql数据库 - SO中文参考 - www.soinside.com...
  7. c++ 删除二叉树的子树_平衡二叉树
  8. 怎么判断日出时间早晚_个个美哭!2020下半年国内旅行时间表出炉!你最想去哪个?...
  9. c malloc 头文件_干货笔记 | C/C++笔试面试详细总结(二)
  10. 最短路径生成树与最小生成树