C# 我应该有返回一次性实例列表的方法吗?

C# 我应该有返回一次性实例列表的方法吗?,c#,.net,collections,idisposable,C#,.net,Collections,Idisposable,我有一个类,需要处理它的实例。我还有几个类生成这些实例,可以是单个实例,也可以是它们的列表 我应该从我的方法返回IList,还是应该创建一个属于MyClassCollection的类,该类也是一次性的,并返回它 编辑: 我问这个问题的主要原因是,我已经做了很多: IList<MyObject> list = GetList(); foreach(MyObject obj in list) { //do something obj.Dispose(); } IL

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

我应该从我的方法返回
IList
,还是应该创建一个属于
MyClassCollection
的类,该类也是一次性的,并返回它

编辑:

我问这个问题的主要原因是,我已经做了很多:

IList<MyObject> list = GetList();
foreach(MyObject obj in list)
{
     //do something
     obj.Dispose();
} 
IList list=GetList();
foreach(列表中的MyObject对象)
{
//做点什么
obj.Dispose();
} 
看来我会做得更好:

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

     } 
}
使用(IList list=GetList())
{
foreach(列表中的MyObject对象)
{
//做点什么
} 
}

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


也许您可以创建一个通用的
IDisposable
列表,其中T:IDisposable上有一个约束,并让您的类通过对其所有元素调用
Dispose
来实现
IDisposable
?然后,您可以对所有不同的
IDisposable
类型重用此类。

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

在这些实例中,容器类可能会更干净。然后,您可以继续使用标准集合类,并被迫更明确地说明项目最后需要处理的时间

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
}

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

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

        } );
 }


}

不确定你会从中获得多少,但在某些情况下,它可能是有用的;)

生成项目序列(
IEnumerable
)可能比生成列表更容易-有几种方法可以将每个项目的生存期绑定到迭代器中,以便:

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

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

hmm有趣。我想可能会有这样的情况:列表中的某些元素被返回到另一个方法,然后处理列表可能会导致problems@bebop:我想如果你选择处理的清单,也许现在对你目前的情况更方便一些,但您的意思是您的客户机应该始终同时处理对象。是否有一个基本的原因,为什么必须同时处理对象?是否可以通过使用一个需要处理的资源以不同的方式对此进行建模?你的情况让我想起了一些关系和交易,或者一个有很多读者的文件。也许您可以使用这些类作为设计的灵感?您的第一个示例在不再需要对象时立即处理它们,但第二个示例使它们保持活动状态,直到整个迭代完成。这是处理对象的两种不同方法,您应该根据哪种方法更合适来选择要使用的方法。为什么要使用“if(o是IDisposable){(o是IDisposable.Dispose();}”?为什么不直接使用'o as IDisposable'然后测试null?@thecoop我真的不知道从这种方法中能得到什么。Id必须使用临时变量,或者如果((o作为IDisposable)!=null){(o作为IDisposable.Dispose()},则必须执行此操作。我觉得这种方式更干净,但也可以随意使用,我觉得没有什么特别之处。:)我认为double(o作为IDisposable)勾选了静态代码分析规则,表示应该为此创建一个变量,以避免不必要的重复强制转换。(对吗?)。干杯
getList().DoStuffAndDisposeElements ( x => doStuff(x));