'Наконец' блок в итераторах

Шаблоны Variadic! (Который объединился со ссылками r-значения, дает нам идеальную передачу!)

8
задан JDunkerley 2 October 2009 в 07:33
поделиться

2 ответа

try / finally работает нормально, если вызывающий использует foreach или вручную вызывает Dispose на IEnumerator . Честно говоря, если он нужен для очистки ресурсов, оператор using , вероятно, будет лучшим способом сделать это в любом случае - если вы используете ресурс, который требует очистки, но не реализует IDisposable , это само по себе проблема :)

Существуют определенные ограничения на то, что вы можете делать в блоках итератора, как объяснил в блоге Эрика Липперта , но все это очень хорошо работает в в большинстве случаев.

Вы можете найти мою статью о реализации блока итератора интересной с точки зрения того, как , наконец, переводится.

6
ответ дан 5 December 2019 в 22:19
поделиться

try/finally works in this case.

public static IEnumerable<string> ReadLines(this Stream stream)
{
    StreamReader rdr = new StreamReader(stream);

    try
    {
        string txt = rdr.ReadLine();
        while (txt != null)
        {
            yield return txt;
            txt = rdr.ReadLine();
        }
        rdr.Close();
    }
    finally
    {
        rdr.Dispose();
    }
}
0
ответ дан 5 December 2019 в 22:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: