【问题标题】:'Finally' Block in Iterators迭代器中的“最终”块
【发布时间】:2010-12-03 06:00:09
【问题描述】:

在 C# 迭代器块中有什么方法可以提供一个代码块,该代码块将在 foreach 结束时运行(或者自然地被中断),比如清理资源?

我想出的最好方法是使用 using 构造,这很好,但确实需要一个 IDisposable 类来进行清理。例如:

    public static IEnumerable<string> ReadLines(this Stream stream)
    {
        using (StreamReader rdr = new StreamReader(stream))
        {
            string txt = rdr.ReadLine();
            while (txt != null)
            {
                yield return txt;
                txt = rdr.ReadLine();
            }
            rdr.Close();
        }
    }

【问题讨论】:

    标签: c# iterator


    【解决方案1】:

    try/finally 工作正常,只要调用者使用foreach 或在IEnumerator&lt;T&gt; 上手动调用Dispose。老实说,如果要清理资源,using 语句可能是最好的方法——如果你使用的资源需要清理但没有实现IDisposable,那就是本身就是一个问题:)

    您可以在迭代器块中执行某些限制,例如 explained on Eric Lippert's blog,但在大多数情况下都可以很好地工作。

    您可能会发现my article about iterator block implementationfinally 的翻译方式很有趣。

    【讨论】:

      【解决方案2】:

      try/finally 在这种情况下有效。

      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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-14
        • 2021-01-17
        • 2014-07-19
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多