我尝试将流作为参数传递,但是我不确定哪种方法是“最好的”,所以希望听到您对我的代码示例的意见/建议
我个人更喜欢选项3,但我从未在其他任何地方看到过这种方法。
选项1适用于小型流(以及已知大小的流)
选项2_1和2_2将始终使“处理程序”不确定谁负责处置/关闭。
public interface ISomeStreamHandler
{
// Option 1
void HandleStream(byte[] streamBytes);
// Option 2
void HandleStream(Stream stream);
// Option 3
void HandleStream(Func<Stream> openStream);
}
public interface IStreamProducer
{
Stream GetStream();
}
public class SomeTestClass
{
private readonly ISomeStreamHandler _streamHandler;
private readonly IStreamProducer _streamProducer;
public SomeTestClass(ISomeStreamHandler streamHandler, IStreamProducer streamProducer)
{
_streamHandler = streamHandler;
_streamProducer = streamProducer;
}
public void DoOption1()
{
var buffer = new byte[16 * 1024];
using (var input = _streamProducer.GetStream())
{
using (var ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
_streamHandler.HandleStream(ms.ToArray());
}
}
}
public void DoOption2_1()
{
_streamHandler.HandleStream(_streamProducer.GetStream());
}
public void DoOption2_2()
{
using (var stream = _streamProducer.GetStream())
{
_streamHandler.HandleStream(stream);
}
}
public void DoOption3()
{
_streamHandler.HandleStream(_streamProducer.GetStream);
}
}
选项2_2是处理可处理资源的标准方法。
您可能没有意识到,但是您正在尝试实现管道设计模式
绕过IStream
,并且无论流起源于何处都实现IDisposable
。处理流的责任在于创建流的对象。