我试图传递流作为参数,但我不确定哪种方式是“最好的”所以我想听听你对我的代码示例的意见/建议
我个人更喜欢选项三,但我更新看到它在其他地方以这种方式完成.
选项1适用于小流(以及已知大小的流)
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,buffer.Length)) > 0) { ms.Write(buffer,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是处理可支配资源的标准方式.
您的SomeTestClass实例向生产者询问流 – 然后SomeTestClass拥有一个流并负责清理.
选项3和2_1依赖于不同的对象来清理SomeTestClass拥有的资源 – 可能无法满足此期望.
选项1是将流的内容复制到另一个流 – 我没有看到这样做的任何好处.