Можете ли вы объяснить мне, что происходит в памяти при выполнении следующего кода:исполнение C# Ленивый + память пониманий
Случай 1:
public static void Execute()
{
foreach(var text in DownloadTexts())
{
Console.WriteLine(text);
}
}
public static IEnumerable<string> DownloadTexts()
{
foreach(var url in _urls)
{
using (var webClient = new WebClient())
{
yield return webClient.DownloadText(url);
}
}
}
Давайте предположим, что после первой итерации я получаю HTML1.
Когда html1 будет очищен от памяти?
- на следующей итерации?
- когда конец foreach заканчивается?
- Когда функция заканчивается?
Благодаря
** Редактировать **
Случай 2:
public static void Execute()
{
var values = DownloadTexts();
foreach(var text in values)
{
Console.WriteLine(text);
}
}
public static IEnumerable<string> DownloadTexts()
{
foreach(var url in _urls)
{
using (var webClient = new WebClient())
{
yield return webClient.DownloadText(url);
}
}
}
В моем понимании, Случай 1 лучше для памяти, то случай 2 верно?
В случае, если 2 по-прежнему будет ссылаться на тексты, которые мы уже скачали, в то время как в случае 1 каждый текст помечен для сбора мусора после его неиспользования. Я прав?
«Предположим, что после первой итерации я получаю html1.» «Можете ли вы пояснить, что вы подразумеваете под« * get html1 * »? –
рассмотрите html1 текст, загруженный и возвращенный в текст (текст var) внутри оператора foreach в функции выполнения –
В дополнение к «когда» вас также может заинтересовать «почему»: http://startbigthinksmall.wordpress.com/ 2008/06/09/за кулисами-c-yield-keyword/ –