public static Stream GenerateStreamFromString(string s)
{
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position = 0;
return stream;
}
No se olvide de usar Usando: no estando dispuestos
using (var stream = GenerateStreamFromString("a,b \n c,d"))
{
// ... Do stuff to stream
}
Sobre el StreamWriter
. StreamWriter
es solo una envoltura alrededor de la transmisión base y no utiliza ningún recurso que deba desecharse. El método Dispose
cerrará el Stream
subyacente en el que StreamWriter
está escribiendo. En este caso, ese es el MemoryStream
que queremos devolver.
En .NET 4.5 ahora hay una sobrecarga para StreamWriter
que mantiene la secuencia subyacente abierta después de que se elimina el escritor, pero este código hace lo mismo y funciona con otras versiones de .NET también.
Ver Is there any way to close a StreamWriter without closing its BaseStream?
Un concepto de punto importante para señalar es que una secuencia se compone de bytes, mientras que una cadena se compone de caracteres. Es crucial entender que la conversión de un carácter a uno o más bytes (o a un flujo como en este caso) __siempre__ usa (o asume) una codificación particular. Esta respuesta, aunque correcta en algunos casos, utiliza la codificación predeterminada, y puede no ser adecuada en general. Pasar explícitamente una codificación al constructor de StreamWriter haría más evidente que el autor necesita considerar las implicaciones de la codificación. – ricovox
Usted dice "No se olvide de usar el Uso" para usar la transmisión, pero en su método 'GenerateStreamFromString' no está usando el Uso con StreamWriter. ¿Hay alguna razón para esto? – Ben
@Ben Sí. Si descarta StreamWriter, la transmisión subyacente también se cerrará. No queremos eso. La única razón por la que el escritor es desechable es limpiar la secuencia, por lo que es seguro ignorarla. –