Каков наилучший подход для вызова 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>
, не пытаясь обобщить?Так ли это, потому что это необычная ситуация?Вы проектируете вокруг, имея это во-первых?Если да, то как?