The call to AddRange
iterates over source
. If for any reason it encounters an exception, any that had previously been acquired will be disposed. Consider this example:
var filenames = new[] { "file1.xml", "file2.xml", "doesnotexist.xml" };
var disposables = filenames.Select(fn => File.OpenRead(fn));
var fileStreams = disposables.Acquire();
No exception will be thrown when you're assigning disposables
, because of lazy evaluation. However, when the call to AddRange
inside Aquire
reaches the third element (where it tries to open "doesnotexist.xml"
), a FileNotFoundException
will be thrown. When this happens, Acquire
will safely dispose the previous streams. A simple ToList
/ ToArray
would leave the first two file streams open.
In essence, Acquire
is there to ensure that either all the files in filenames
is safely opened, or none of them are.