【发布时间】:2017-03-25 18:13:39
【问题描述】:
我正在编写一个将数据导出到 Stream 的 API:
public interface IExporter<in T>
{
Task ExportAsync(IEnumerable<T> inputs, Stream output);
}
可能各种IExporter 实现将使用TextWriter/StreamWriter 的形式,但我不想在接口上强制执行它。
使用StreamWriter 的主要问题是默认情况下它会关闭底层流(我知道有一个构造函数但它需要bufferSize,我可以继承StreamWriter 但我也不喜欢它)。
我应该在我的IExporter 实现中简单地“拥有”Stream(并通过处理我的StreamWriter 来处理它)还是有更好的方法来处理这个问题?
【问题讨论】:
-
@HansPassant 我不明白,我可以使用
using关键字还是我遗漏了什么?例如using (var stream = ...) { await _exporter.ExportAsync(..., stream); }? -
可以,但是要求客户端代码使用await。当它不工作时,它的工作会相当糟糕。只是没有必要,将假定 Export 方法消耗整个流,而不仅仅是其中的一部分。所以流对象完成后总是无用的,它还不如将它处理掉,现在它永远不会出错。否则 .NET 流总是转移所有权的核心原因。
-
@HansPassant,使用这种方法,我无法将多次导出到一个流中。如果我想按顺序写入数据怎么办?我不能假设
Export()方法会消耗整个流。
标签: c# architecture