.Net流:返回与提供

Dan*_*ark 6 .net c# memorystream stream

我一直想知道Stream在C#.Net中使用类的最佳实践是什么.提供已写入或提供的流是否更好?即:

public Stream DoStuff(...)
{
    var retStream = new MemoryStream();
    //Write to retStream
    return retStream;
}
Run Code Online (Sandbox Code Playgroud)

而不是;

public void DoStuff(Stream myStream, ...)
{
    //write to myStream directly
}
Run Code Online (Sandbox Code Playgroud)

为了生命周期控制,我总是使用前一个例子,但我有这种感觉,Stream因为缺少一个更好的词,这是一种"流式传输"的糟糕方式.

Chr*_*heD 8

我更喜欢"第二种方式"(在提供的流上运行),因为它有一些明显的优点:

  • 您可以拥有多态性(假设您的签名证明您可以对任何类型的Stream提供操作).
  • Stream现在或以后很容易被抽象为扩展方法.
  • 你明确划分责任.此方法不应该关心如何构造流,而只关心如何对其应用某个操作.

此外,如果你要返回一个新的流(选项1),你会觉得有点奇怪,你必须Seek再次首先才能从中读取它(除非你在方法本身中这样做,这是次优的再一次,因为它可能并不总是需要 - 在所有情况下都可能无法从中读取流.不必Seek通过已经存在的流明确写入流的方法后,似乎不那么尴尬.


And*_*erd 5

我看到 Streams 的好处是你不需要知道你正在流式传输到什么。

在第二个示例中,您的代码可能正在写入内存,也可能直接写入文件或某个网络缓冲区。从函数的角度来看,实际的输出目的地可以由调用者决定。

出于这个原因,我更喜欢第二种选择。

第一个功能只是写入内存。在我看来,如果它不返回流,而是返回实际的内存缓冲区会更清楚。如果他/她愿意,呼叫者然后可以附加一个内存流。

public byte[] DoStuff(...)
{
    var retStream = new MemoryStream();
    //Write to retStream
    return retStream.ToArray();
}
Run Code Online (Sandbox Code Playgroud)