Para ilustrar esto, vamos a editar el código
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
Para evitar esto, basta con crear el escritor directamente
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 en cuenta lo que Eric Lippert está diciendo, hay podría ser un momento en el que la secuencia solo sea liberada por el finalizador si BinaryWriter arroja una excepción. De acuerdo con el código BinaryWriter, que pudiera ocurrir en tres casos
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
- si no se ha especificado una salida, es decir, si la corriente es nula. Eso no debería ser un problema ya que una secuencia nula significa que no hay recursos para deshacerse de :)
- si no especificó una codificación. ya que no usamos la forma del constructor donde se especifica la codificación, aquí tampoco debería haber ningún problema (no miré demasiado en el contructor de codificación, pero puede lanzar una página de códigos no válida)
- if you don ' t pasa una secuencia de escritura. Eso debería ser cogido con bastante rapidez durante el desarrollo ...
De todos modos, buen punto, por lo tanto, la edición :)
A partir de hoy, VS2017 está lanzando CA2202 sobre cada una de las cláusulas 'using'. Alguien tiene que actuar juntos. – ajeh