代码之家  ›  专栏  ›  技术社区  ›  Sam Holder Brian Adams

我应该有返回可释放实例列表的方法吗?

  •  6
  • Sam Holder Brian Adams  · 技术社区  · 16 年前

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

    我应该回来吗? 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 回复  |  直到 16 年前
        1
  •  1
  •   Mongus Pong    16 年前

    在这些实例中,容器类可能更干净。然后,您可以继续使用标准集合类,并且必须更加明确地说明在最后何时需要处理这些项。

    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
    }
    

    您可以用作:

    using ( new ListScope ( list ) )
    {
       // Do stuff with list
    }
    
        2
  •  3
  •   Marc Gravell    16 年前

    生成一个 序列 项目( IEnumerable<T> )而不是一个列表-有一些方法可以将每个生命周期绑定到迭代器中,以便:

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

    这是我探讨的一个话题 here 使用LINQ,但是如果源是(或者可以是)序列,也有其他方法。

        3
  •  2
  •   Mark Byers    16 年前

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

    也许你可以做一个通用的 IDisposableList<T> 对t有约束 where T : IDisposable 让你的班级工具 IDisposable 通过呼叫 Dispose 所有的元素?然后,您可以为所有不同的 可识别 类型。

        4
  •  2
  •   Hans Passant    16 年前

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

        5
  •  1
  •   Mongus Pong    16 年前

    如果需要,还可以使用扩展名:

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

    不知道你会从中得到多少,但在某些情况下,它可能会有用;)

    推荐文章