C# lambda表达式参数的正确使用姿势
2017-11-16 14:42
417 查看
C#的lambda表达式的好用就不多说了,中午吃饭的时候突然想到一个以前(有年头了,难道屌丝上岁数了就回忆这个么。。。)和同事争执的坑。。
列个demo吧。。
先是一个类,这个类的对象就是为了吃堆内存用的,,
然后再来个类存放个事件
测试代码如下;
估计乍一看,不知所云。。不明所以。其实主要想说的是事件注册的这个lambda表达式,这块存在比较大的问题,很多人为了方便会在lambda表达式内直接使用作用域范围外的对象,比如说这个mod对象,委托也就是方法的引用,也可以说是方法的指针,运行时在执行方法时会打开栈帧,并将方法使用到的参数或参数的引用存储到该栈帧的局部变量区中,此处我定义的事件目测只有一个int类型的参数,但由于这种随意的编码就导致了我附加了两个参数,也就是mod对象。也就是说这个mod对象会被局部变量区持续引用也就发生了垃圾回收器无法对该对象进行回收了,直到EventClass对象释放为止(当然此方法内是不会的。。)。结果也就内存泄漏了。。
当然场景不只是在这个while场景下,委托内使用作用域范围外的对象都会增加那个对象的生命周期。。
对于这种情况发生的场景。。还是有一些的。。。
列个demo吧。。
先是一个类,这个类的对象就是为了吃堆内存用的,,
publicclassMemoryModel { publicMemoryModel(intid) { Data=newbyte[1024*1024]; Id=id; } publicbyte[]Data{set;get;} publicintId{set;get;} }
然后再来个类存放个事件
publicclassEventClass { publicvoidShow(intm) { if(ShowMe!=null) ShowMe(m); } publiceventAction<int>ShowMe; }
测试代码如下;
EventClasse=newEventClass(); inti=0; while(true) { List<MemoryModel>list=newList<MemoryModel>(); i++; for(intj=0;j<100;j++) { varmod=newMemoryModel(i); e.ShowMe+=c=> { strings=mod.Id+"----"+mod.Data.Length; Console.Write(c); }; list.Add(mod); } Thread.Sleep(50); list.Clear(); }
估计乍一看,不知所云。。不明所以。其实主要想说的是事件注册的这个lambda表达式,这块存在比较大的问题,很多人为了方便会在lambda表达式内直接使用作用域范围外的对象,比如说这个mod对象,委托也就是方法的引用,也可以说是方法的指针,运行时在执行方法时会打开栈帧,并将方法使用到的参数或参数的引用存储到该栈帧的局部变量区中,此处我定义的事件目测只有一个int类型的参数,但由于这种随意的编码就导致了我附加了两个参数,也就是mod对象。也就是说这个mod对象会被局部变量区持续引用也就发生了垃圾回收器无法对该对象进行回收了,直到EventClass对象释放为止(当然此方法内是不会的。。)。结果也就内存泄漏了。。
当然场景不只是在这个while场景下,委托内使用作用域范围外的对象都会增加那个对象的生命周期。。
对于这种情况发生的场景。。还是有一些的。。。
相关文章推荐
- android studio使用Lambda表达式的正确姿势
- android studio 3.0版本下使用lambda表达式的正确配置姿势
- 编写高质量代码改善C#程序的157个建议——建议37:使用Lambda表达式代替方法和匿名方法
- C#使用正则表达式验证手机号格式是否正确
- (转) C#异步调用使用匿名方法Lambda表达式
- NET(C#):使用Expression Tree构建带有参数、本地变量和返回值的Lambda
- C# Error CS1628: 不能在匿名方法、lambda 表达式或查询表达式中使用 ref 或 out 参数
- 《转》c#中Lambda表达式使用
- 学习笔记之在查询中使用 Lambda 表达式(C# 编程指南)
- C#中Lambda表达式的使用方法
- C#操作使用xsd的xml文件时XPath表达式不正确的问题
- python之lambda表达式 : 对于python中max函数的key参数的理解与使用
- C# Lambda表达式 使用(记录自己使用记录)
- C# 函数式编程 —— 使用 Lambda 表达式编写递归函数
- 学习笔记之在 LINQ 外部使用 Lambda 表达式(C# 编程指南)
- 深入理解 c# 第一章 使用lambda表达式 对 List <Product> 进行排序
- C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:
- C# 集合类之lambda表达式使用
- 将Lambda表达式作为参数传递并解析——在构造函数参数列表中使用Lambda表达式(C#)
- C#中Lambda表达式的使用