2010-05-12 153 views
0

我有我可以解决方法是使用下面List.ForEach中的lambda是否导致内存泄漏和性能问题?

sortedElements.ForEach((XElement el) => PrintXElementName(el,i++)); 

问题,这意味着我有一个的ForEach拉姆达允许使用如int我的参数。

我喜欢这样做的方式,但我读了一些地方,匿名方法和委托与lambda导致大量的内存泄漏,因为每次lambda被执行的东西被实例化,但不被释放。类似的东西。

请问在这种情况下是否属实,请问这是否属实?

+0

不是内存泄漏,但lambda/foreach可能存在问题:http://weblogs.asp.net/fbouma/archive/2009/06/25/linq-beware-of-the-access-to-modified -declosure-demon.aspx – tanascius 2010-05-12 12:06:07

回答

6

我喜欢做的这种方式,但我 地方读到因为每次 执行时拉姆达东西 实例化,但不是匿名方法 与拉姆达代表导致 大量的内存泄漏发布

不,这是不正确的。现在使用的资源将不会被释放,直到委托被垃圾收集。它就像其他任何托管对象一样,但在大多数情况下使用Lambda表达式的效率并不比以其他方式完成同样事情的效率低。

这并不是说你不能使lamda表达式导致大量的内存泄漏,就像其他代码一样。如果你是说像做

(x => //open unmanaged resource here and not close it....) 

,并呼吁,在一个foreach循环,这可能是非常糟糕的。

你必须记住的是,你的Lamda表达基本上是

(XElement el) => PrintXElementName(el,i++) 

void Your_Function (XElement el) 
{ 
    PrintXElementName(el,i++); 
} 
+0

Shoudlnt'it'return PrintXElementName(el,i ++); '? – 2010-05-12 12:05:44

+1

ForEach不返回任何内容。它通过集合中的每个元素循环。 – kemiller2002 2010-05-12 12:08:30

0

这是不值得担心,直到您分析您的应用程序,它泄漏内存。