如果 StreamWriter 未释放,MemoryStream.ToArray() 返回空数组

Vik*_*iev 2 .net c# stream

我试图从我的模型中获取字节数组并将其放入文件中。我有这样的方法:

        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();
    }
Run Code Online (Sandbox Code Playgroud)

此方法工作正常,但可能认为我不需要手动处置StreamWriter,因为我有一个 using 语句。我也这么想,但是当我删除时sw.Dispose();返回ms.ToArray();一个空数组。有人可以向我解释这种行为吗?

can*_*on7 6

你有这行:

using var sw = new StreamWriter(ms);
Run Code Online (Sandbox Code Playgroud)

StreamWriter这仅在方法结束时处理。但是,您在方法结束ms.ToArray() 之前调用。这意味着您在处理ms.ToArray()之前致电。StreamWriter

然而, 正在内部缓冲一些数据,并且仅在处理时StreamWriter将其刷新到。MemoryStream因此,您需要确保在调用StreamWriter 之前ms.ToArray()处理掉.

使用旧语法可能更清楚using,它明确说明了处置何时发生:

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();
        }
    }

    return ms.ToArray();
}
Run Code Online (Sandbox Code Playgroud)