Aby zilustrować, niech edytować kod
using(var stream = File.Open(newFilename, FileMode.CreateNew))
{
using(var reader = new BinaryReader(file.InputStream))
{
using(var writer = new BinaryWriter(stream))
{
var chunk = new byte[ChunkSize];
Int32 count;
while((count = reader.Read(chunk, 0, ChunkSize)) > 0)
{
writer.Write(chunk, 0, count);
}
} // here we dispose of writer, which disposes of stream
} // here we dispose of reader
} // here we dispose a stream, which was already disposed of by writer
Aby tego uniknąć, wystarczy utworzyć pisarza bezpośrednio
using(var reader = new BinaryReader(file.InputStream))
{
using(var writer = new BinaryWriter(File.Open(newFilename, FileMode.CreateNew)))
{
var chunk = new byte[ChunkSize];
Int32 count;
while((count = reader.Read(chunk, 0, ChunkSize)) > 0)
{
writer.Write(chunk, 0, count);
}
} // here we dispose of writer, which disposes of its inner stream
} // here we dispose of reader
edit
: należy wziąć pod uwagę to, co Eric Lippert mówi, że może rzeczywiście być momentem, w którym strumień zostanie zwolniony przez finalizatora, jeśli BinaryWriter zgłasza wyjątek. Zgodnie z kodeksem BinaryWriter, które mogą występować w trzech przypadkach
If (output Is Nothing) Then
Throw New ArgumentNullException("output")
End If
If (encoding Is Nothing) Then
Throw New ArgumentNullException("encoding")
End If
If Not output.CanWrite Then
Throw New ArgumentException(Environment.GetResourceString("Argument_StreamNotWritable"))
End If
- jeśli nie określił wyjście, czyli jeśli strumień jest null. Nie powinno to stanowić problemu, ponieważ strumień zerowy oznacza brak zasobów do utylizacji :)
- , jeśli nie określono kodowania. ponieważ nie używamy formularza konstruktora, w którym określono kodowanie, nie powinno tu być problemu (nie zaglądałem zbytnio w kodowanie contructor, ale może wrzucić niepoprawną stronę kodową)
- jeśli nie t przekazać zapisywalny strumień. To powinno być złapany dość szybko w trakcie rozwoju ...
Zresztą dobry punkt, stąd edit :)
dzień dzisiejszy VS2017 jest rzucanie CA2202 o każdy 'using' klauzuli. Ktoś musi działać razem. – ajeh