我应该有返回Disposable实例列表的方法吗?

时间:2010-01-29 09:33:12

标签: c# .net collections idisposable

我有一个类,需要处理其中的实例。我还有几个类可以生成这些实例,可以是单独的,也可以是它们的列表。

我应该从我的方法中返回IList<MyClass>还是应该创建一个MyClassCollection的类,这个类也是一次性的,然后返回它?

编辑:

我要问的主要原因是我最终做了很多这样的事情:

IList<MyObject> list = GetList();
foreach(MyObject obj in list)
{
     //do something
     obj.Dispose();
} 

似乎我会做得更好:

using (IList<MyObject> list = GetList())
{
     foreach(MyObject obj in list)
     {
     //do something

     } 
}

5 个答案:

答案 0 :(得分:3)

生成项目(IEnumerable<T>)而不是列表的序列可能更容易 - 有些方法可以使每个项目的生命周期与迭代器相关联,这样:

  • 你一次只有一个(我认为它们很贵)
  • 他们在时间到了时就被处理了
  • 他们都被处理掉了,即使是错误的

这是我使用LINQ探讨here的主题,但如果您的源是(或可能是)序列,还有其他方法。

答案 1 :(得分:2)

这取决于你将如何使用它们,两者似乎都是合理的选择。如果你知道你需要同时处理所有的对象,那么可能使列表是一次性的,但是如果对象可以有不同的生命周期,我只会返回一个普通的列表。

也许您可以在T IDisposableList<T>上设置一个约束where T : IDisposable,并通过在其所有元素上调用IDisposable让您的类实现Dispose?然后,您可以将此类重用于所有不同的IDisposable类型。

答案 2 :(得分:2)

完全由客户端代码来调用Dispose()方法。只有它知道何时使用对象完成。您无法以任何方式提供帮助,因为您不知道该代码的外观。创建处理其元素的列表对象不是一个好主意。该框架不包含执行此操作的集合对象。你只会混淆客户端代码程序员。

答案 3 :(得分:1)

在这些情况下,容器类可能更清晰。然后,您可以继续使用标准集合类,并且您必须更明确地知道项目何时需要在最后处置。

public class ListScope : IDisposable
{
    private IList list;
    public ListScope(IList list)
    {
        this.list = list;
    }

    #region IDisposable Members

    public void Dispose ()
    {
        foreach ( object o in this.list )
        {
            IDisposable disposable = ( o as IDisposable );
            if (disposable != null)
                    disposable.Dispose ();
        }
    }

    #endregion
}

您可以使用as:

using ( new ListScope ( list ) )
{
   // Do stuff with list
}

答案 4 :(得分:1)

如果您愿意,也可以使用扩展程序:

static class Extensions
{
 public static void DoStuffAndDisposeElements<T> ( this List<T> list, Action<T> action )
 {
        list.ForEach ( x => { action ( x );
               IDisposable disposable = (x as IDisposable);
               if ( disposable != null )
                  disposable.Dispose ();

        } );
 }


}

你可以打电话:

getList().DoStuffAndDisposeElements ( x => doStuff(x));

不确定从中获得多少,但可能会出现有用的情况;)

相关问题