如何最好地调用序列中元素的Dispose()
方法?
假设有以下代码:
IEnumerable<string> locations = ...
var streams = locations.Select ( a => new FileStream ( a , FileMode.Open ) );
var notEmptyStreams = streams.Where ( a => a.Length > 0 );
//from this point on only `notEmptyStreams` will be used/visible
var firstBytes = notEmptyStreams.Select ( a => a.ReadByte () );
var average = firstBytes.Average ();
在保持代码简洁的同时,如何处理FileStream
实例(一旦不再需要)?
澄清一下:这不是实际的代码片段,这些行是分布在一组类中的方法,FileStream
类型也只是一个示例。
是否可以采用以下方式:
public static IEnumerable<TSource> Where<TSource> (
this IEnumerable<TSource> source ,
Func<TSource , bool> predicate
)
where TSource : IDisposable {
foreach ( var item in source ) {
if ( predicate ( item ) ) {
yield return item;
}
else {
item.Dispose ();
}
}
}
这是一个好主意吗?
或者说:当涉及到 IEnumerable<IDisposable>
的非常特定的场景时,你是否总是试图将其泛化处理?这是因为拥有它是不典型的情况吗?你是否从一开始就设计了它?如果是这样,那么你是如何设计的?