я осматривал MoreLinq на Джона тарелочкам, и я стал любопытным о расширении приобретают исходный кодПодробнееLinq Acquire. Что оно делает?
/// <summary>
/// Ensures that a source sequence of <see cref="IDisposable"/>
/// objects are all acquired successfully. If the acquisition of any
/// one <see cref="IDisposable"/> fails then those successfully
/// acquired till that point are disposed.
/// </summary>
/// <typeparam name="TSource">Type of elements in <paramref name="source"/> sequence.</typeparam>
/// <param name="source">Source sequence of <see cref="IDisposable"/> objects.</param>
/// <returns>
/// Returns an array of all the acquired <see cref="IDisposable"/>
/// object and in source order.
/// </returns>
/// <remarks>
/// This operator executes immediately.
/// </remarks>
public static TSource[] Acquire<TSource>(this IEnumerable<TSource> source)
where TSource : IDisposable
{
if (source == null) throw new ArgumentNullException("source");
var disposables = new List<TSource>();
try
{
disposables.AddRange(source);
return disposables.ToArray();
}
catch
{
foreach (var disposable in disposables)
disposable.Dispose();
throw;
}
}
В моем понимании это получает IEnumerable<IDisposable>
и это создает List<IDisposable>
.
Я не могу понять, что может пойти не так.
Может ли кто-нибудь объяснить это мне и, возможно, предоставить пример, где это расширение может быть полезно?
Я думаю, что Джон Скит был бы наиболее подходящим для ответа на этот вопрос по понятным причинам. Что касается примеров, давайте просто скажем, что у меня есть последовательность/массив/список закрытых дескрипторов файлов, и я хотел бы открыть их все и сделать с ними что-то (и мне все они нужны). Если какой-либо из файлов не открывается, я хотел бы закрыть все остальные дескрипторы автоматически. В этой ситуации 'Acquire' будет делать именно это. –
Ленивый перечислимый может исключить исключение на полпути через итерацию. В этом случае вы должны «Утилизировать» все более ранние объекты, которые выполняет эта функция. – CodesInChaos
Все ответы идеальны, и я хотел бы отметить все их как * принятых *, но мне нужно было выбрать только один. Глядя на ответы, я почувствовал, как «D'oh» –