我有一个类,需要处理其中的实例。我还有几个类可以生成这些实例,可以是单独的,也可以是它们的列表。
我应该从我的方法中返回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
}
}
答案 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));
不确定从中获得多少,但可能会出现有用的情况;)