Приводит ли лямбда в List.ForEach к утечкам памяти и проблемам с производительностью? - PullRequest
0 голосов
/ 12 мая 2010

У меня есть проблема, которую я мог бы решить, используя что-то вроде этого

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

А это значит, что у меня в ForEach лямбда, которая позволяет использовать такие параметры, как int i.

Мне нравится такой способ, но я где-то читал, что анонимные методы и делегаты с лямбдой приводят к большим утечкам памяти, потому что каждый раз, когда лямбда выполняется, что-то создается, но не выпускается. Что-то вроде того.

Не могли бы вы сказать мне, верно ли это в этой ситуации и почему?

Ответы [ 2 ]

6 голосов
/ 12 мая 2010

Мне нравится такой способ, но я где-то читал что анонимные методы и делегаты с лямбда приводит к много утечек памяти, потому что каждый раз когда лямбда выполняется что-то создан, но не выпущен

Нет, это не правда. Теперь используемые ресурсы не будут освобождены, пока делегат не будет собран мусором. Это так же, как и любой другой управляемый объект, но использование лямбда-выражения в большинстве случаев не менее эффективно, чем выполнение того же действия другим способом.

Это не означает, что вы не можете заставить выражение 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 голосов
/ 12 мая 2010

Не стоит беспокоиться, пока вы не профилируете свое приложение, и оно не утечет память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...