MemoryStream.ToArray() devuelve un array vacío si StreamWriter no se ha cerrado correctamente.
Estoy tratando de obtener un arreglo de bytes de mi modelo para ponerlo en el archivo. Tengo un método de la siguiente manera:
public static byte[] GetByteArray(List<mymodel> models)
{
using var ms = new MemoryStream();
using var sw = new StreamWriter(ms);
foreach (var model in models)
{
sw.Write(model.Id + "," + model.Name);
sw.WriteLine();
}
sw.Dispose();
return ms.ToArray();
}
Este método funciona bien, pero como puedan pensar, no necesito eliminar manualmente el StreamWriter
porque tengo una declaración using
. Pensé lo mismo, pero cuando elimino sw.Dispose();
, ms.ToArray();
devuelve un arreglo vacío. ¿Alguien puede explicarme este comportamiento?
davy.ai
La instrucción
using
en C# es en realidad una sintaxis abreviada para un bloque try-finally, donde el métodoDispose
es llamado en el bloque finally para liberar cualquier recurso que el objeto esté sosteniendo. Sin embargo, en este caso,MemoryStream
es un recurso administrado y debería ser limpiado automáticamente por el recolector de basura sin necesidad de una llamada explícita aDispose
.El problema aquí es que el objeto
StreamWriter
tiene una referencia al objetoMemoryStream
subyacente. Cuando llamas explícitamente asw.Dispose()
, se vacía cualquier dato pendiente al flujo y además se elimina la referencia al flujo, liberándolo. Sin esta llamada, el flujo aún tiene una referencia al objetoMemoryStream
y por lo tanto, el métodoToArray()
retorna un arreglo de bytes vacío.En resumen, aunque el objeto
StreamWriter
sea creado en una instrucciónusing
, aún es necesario llamar explícitamente aDispose()
para asegurarse de que cualquier dato pendiente sea vaciado y el flujo subyacente sea liberado.