Per illustrare, modifichiamo il codice
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
Per evitare questo, basta creare lo scrittore direttamente
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
: tener conto di ciò che Eric Lippert sta dicendo, non ci potrebbe effettivamente essere un momento in cui il flusso viene rilasciato dal finalizzatore solo se BinaryWriter genera un'eccezione. Secondo il codice BinaryWriter, che potrebbe avvenire in tre casi
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
- se non è stato specificato un output, vale a dire se il flusso è nullo. Questo non dovrebbe essere un problema dato che un flusso null significa nessuna risorsa da smaltire :)
- se non hai specificato una codifica. dal momento che non usiamo la forma di costruzione in cui viene specificata la codifica, non ci dovrebbe essere alcun problema neanche qui (non ho guardato in contructor codifica troppo, ma una tabella di codici non valida può buttare)
- se si don' passare un flusso scrivibile. Questo dovrebbe essere catturati abbastanza rapidamente durante lo sviluppo ...
In ogni caso, buon punto, quindi la modifica :)
Ad oggi, VS2017 lancia CA2202 su ciascuna clausola 'using'. Qualcuno ha bisogno di agire insieme. – ajeh