StreamWriter.Close() dice que también cierra la secuencia subyacente de StreamWriter. ¿Qué pasa con StreamWriter.Dispose? No botar también disponer y/o cerrar la secuencia subyacente¿.Disponiendo un StreamWriter cierra el flujo subyacente?
Respuesta
StreamWriter.Close() sólo llama StreamWriter.Dispose() bajo el capó, por lo que hacen exactamente lo mismo. StreamWriter.Dispose() cierra la secuencia subyacente.
Reflector es su amigo para este tipo de preguntas :)
Cerrar y botar son sinónimos de StreamWriter.
Bueno, casi sinónimos. –
De StreamWriter.Close()
public override void Close()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
De TextWriter.Dispose() (que hereda StreamWriter)
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
Ellos son por lo tanto, idénticos.
citar marco Directrices de diseño por Cwalina y Abrams en la sección sobre el patrón disponer:
CONSIDERAN proporcionar método
Close()
, además de laDispose()
, si estrecha es la terminología estándar en el zona.
Aparentemente, Microsoft sigue sus propias pautas, y suponiendo que esto es casi siempre una apuesta segura para la biblioteca de clase base .NET.
Algunas personas dirán, apenas no deseche la corriente, esto es realmente una mala idea, porque una vez que el StreamWriter sale del ámbito GarbageCollection puede recogerlo en cualquier momento y dipose ella, cerrando así la manija a la corriente, pero la creación de una clase descendiente que anula este comportamiento de StreamWriter es fácil, aquí está el código:
/// <summary>
/// Encapsulates a stream writer which does not close the underlying stream.
/// </summary>
public class NoCloseStreamWriter : StreamWriter
{
/// <summary>
/// Creates a new stream writer object.
/// </summary>
/// <param name="stream">The underlying stream to write to.</param>
/// <param name="encoding">The encoding for the stream.</param>
public NoCloseStreamWriter(Stream stream, Encoding encoding)
: base(stream, encoding)
{
}
/// <summary>
/// Creates a new stream writer object using default encoding.
/// </summary>
/// <param name="stream">The underlying stream to write to.</param>
/// <param name="encoding">The encoding for the stream.</param>
public NoCloseStreamWriter(Stream stream)
: base(stream)
{
}
/// <summary>
/// Disposes of the stream writer.
/// </summary>
/// <param name="disposing">True to dispose managed objects.</param>
protected override void Dispose(bool disposeManaged)
{
// Dispose the stream writer but pass false to the dispose
// method to stop it from closing the underlying stream
base.Dispose(false);
}
}
Si nos fijamos en el reflector/ILSpy usted encontrará que el cierre del flujo base se hace realmente en Dispose (true), y cuando se llama close, solo llama a Dispose which calls Dispose (True), desde el código no debería haber otros efectos secundarios, por lo que la clase anterior funciona bien.
Es posible que desee añadir todos los constructores, sin embargo, yo sólo he añadido 2 aquí por simplicidad.
Muy útil para CryptoStream – nergeia
Está intentando solucionar un problema que no existe. El GC * no * eliminará ningún objeto, * los finalizará *. Y el finalizador de 'StreamWriter' * llamaría' Dispose (false) ', es decir, * not * eliminaría el' BaseStream'. Digo * would *, porque 'StreamWriter' ni siquiera tiene un finalizador, porque no necesita uno (no hay nada significativo que pueda hacer en su finalizador). –
La respuesta es sencilla, y siempre por encima de: sí, disponiendo una corriente cierra cualquier secuencia subyacente. He aquí un ejemplo:
public static string PrettyPrintXML_bug(XDocument document)
{
string Result = "";
using (MemoryStream mStream = new MemoryStream())
{
using (XmlTextWriter writer = new XmlTextWriter(mStream, Encoding.Unicode))
{
writer.Formatting = Formatting.Indented; // <<--- this does the trick
// Write the XML into a formatting XmlTextWriter
document.WriteTo(writer);
// change the memory stream from write to read
writer.Flush();
mStream.Flush();
} // <-- <-- <-- <-- <-- <-- <-- <-- <-- <-- this also "closes" mStream
mStream.Position = 0;//rewind <-- <-- <-- "cannot Read/Write/Seek"
// Read MemoryStream contents into a StreamReader.
using (StreamReader sReader = new StreamReader(mStream)) // <-- <-- Exception: Cannot access a closed stream
{
// Extract the text from the StreamReader.
Result = sReader.ReadToEnd();
}
}
return Result;
}
y aquí la solución, donde hay que retrasar botar a donde el MemoryStream subyacente no se necesita más:
public static string PrettyPrintXML(XDocument document)
{
string Result = "";
using (MemoryStream mStream = new MemoryStream())
{
using (XmlTextWriter writer = new XmlTextWriter(mStream, Encoding.Unicode))
{
writer.Formatting = Formatting.Indented; // <<--- this does the trick
// Write the XML into a formatting XmlTextWriter
document.WriteTo(writer);
// change the memory stream from write to read
writer.Flush();
writer.Close();
mStream.Flush();
mStream.Position = 0;//rewind
// Read MemoryStream contents into a StreamReader.
using (StreamReader sReader = new StreamReader(mStream))
{
// Extract the text from the StreamReader.
Result = sReader.ReadToEnd();
}
}// <-- here the writer may be Disposed
}
return Result;
}
Teniendo en cuenta estos ejemplos, no entiendo por qué cerrar la secuencia subyacente es una característica.
acabo le gusta compartir esto.
- 1. ¿El cierre de un BufferedOutputStream también cierra el OutputStream subyacente?
- 2. ¿Está bien no cerrar StreamReader/StreamWriter para mantener abierta la secuencia subyacente?
- 3. ¿Por qué Scala Source no cierra el InputStream subyacente?
- 4. StreamReader y StreamWriter en el mismo Stream?
- 5. C# Unit Prueba un parámetro StreamWriter
- 6. Liberación del flujo subyacente devuelto por Application.GetResourceStream en WP7
- 7. StreamWriter escribiendo en MemoryStream
- 8. Agregar texto usando StreamWriter
- 9. Adjuntar líneas a un archivo utilizando StreamWriter
- 10. ¿Cómo crear un directorio usando StreamWriter?
- 11. ¿Convierte un StreamWriter a OutputStream en java?
- 12. Diferencia entre StreamWriter/Reader y StringWriter/Readerll
- 13. FileStream vs/differences StreamWriter?
- 14. DropDownList obtener el objeto subyacente
- 15. ¿Cerrar SSL sin cerrar el socket subyacente?
- 16. ¿FileStream.Dispose cierra el archivo inmediatamente?
- 17. ¿Cómo puedo separar una secuencia de un lector de flujo o un escritor de flujo?
- 18. ¿Se cierra un hilo automáticamente?
- 19. cierra un archivo abierto con os.fdopen cierra el fd de nivel os?
- 20. El emulador no cierra Ubuntu
- 21. Comportamiento de tomas de Java cuando se cierra flujo de salida
- 22. Restablecer el estado de un flujo
- 23. Java: ¿Reader.close() cierra cualquier Lector encadenado?
- 24. StreamWriter no está escribiendo los últimos caracteres en un archivo
- 25. ¿Cómo se escribe un archivo usando StreamWriter en Windows 8?
- 26. ¿Es necesario ajustar StreamWriter en un bloque de uso? Hace
- 27. C# ¿puedo crear un nombre de archivo dinámico con streamwriter?
- 28. Escribir Unicode cadena en un archivo mediante StreamWriter no funciona
- 29. Comprobando si un ValidationGroup es válido desde el código subyacente
- 30. ¿Cómo obtener el manejador de archivo subyacente de un Stream?
técnicamente llama a Dispose (bool) debajo del capó, un detalle más insignificante aunque – ShuggyCoUk
tienes razón. Debería haber dicho que "pide deshacerse" sin especificar realmente qué sobrecarga. Buen lugar. –
* No * elimina la transmisión. Simplemente lo cierra. – cloggins