Шаблоны Variadic! (Который объединился со ссылками r-значения, дает нам идеальную передачу!)
try
/ finally
работает нормально, если вызывающий использует foreach
или вручную вызывает Dispose
на IEnumerator
. Честно говоря, если он нужен для очистки ресурсов, оператор using
, вероятно, будет лучшим способом сделать это в любом случае - если вы используете ресурс, который требует очистки, но не реализует IDisposable
, это само по себе проблема :)
Существуют определенные ограничения на то, что вы можете делать в блоках итератора, как объяснил в блоге Эрика Липперта , но все это очень хорошо работает в в большинстве случаев.
Вы можете найти мою статью о реализации блока итератора интересной с точки зрения того, как , наконец,
переводится.
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();
}
}