我一直想知道在C#.Net中使用Stream
类的最佳做法是什么。提供已写入或提供的流是否更好?
即:
public Stream DoStuff(...)
{
var retStream = new MemoryStream();
//Write to retStream
return retStream;
}
而不是;
public void DoStuff(Stream myStream, ...)
{
//write to myStream directly
}
为了生命周期控制,我总是使用前面的例子,但我觉得这是一种糟糕的流式传输方式"由于缺少更好的词,Stream
为{。}。
答案 0 :(得分:8)
我更喜欢“第二种方式”(在提供的流上运行),因为它有一些明显的优势:
Stream
进行操作。)Stream
扩展方法。另外,如果你要返回一个新的流(选项1),你会感到有点奇怪,你必须先再次Seek
才能从中读取它(除非你那样做)在方法本身中,由于可能并不总是需要,因此再次是次优的 - 在所有情况下都可能无法从之后读取流。在将现有流传递给明确写入流的方法之后,必须Seek
似乎并不那么尴尬。
答案 1 :(得分:4)
我看到Streams的好处是你不需要知道你要传输的是什么。
在第二个示例中,您的代码可能是写入内存,可能是直接写入文件或某些网络缓冲区。从函数的角度来看,实际的输出目的地可以由调用者决定。
出于这个原因,我更喜欢第二种选择。
第一个功能就是写入内存。在我看来,如果它不返回流,而是实际的内存缓冲区会更清楚。然后,如果他/她愿意,呼叫者可以附加记忆流。
public byte[] DoStuff(...)
{
var retStream = new MemoryStream();
//Write to retStream
return retStream.ToArray();
}
答案 2 :(得分:0)
第二个100%。您不想假设他们想要哪种流。他们想流式传输到网络还是磁盘?他们是否希望将其缓冲?把这些留给他们。
他们可能还想重用流,以避免一遍又一遍地创建新的缓冲区。或者他们可能想在同一流上端对端流式传输多个事物。
如果提供流,则可以控制流的类型及其生存期。否则,您也可能只返回类似字符串或数组的内容。流实际上并没有给您带来任何好处。