加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 传递流的最佳方式是什么?

发布时间:2020-12-15 07:57:07 所属栏目:百科 来源:网络整理
导读:我试图传递流作为参数,但我不确定哪种方式是“最好的”所以我想听听你对我的代码示例的意见/建议 我个人更喜欢选项三,但我更新看到它在其他地方以这种方式完成. 选项1适用于小流(以及已知大小的流) 选项2_1和2_2总是让“管理员”怀疑谁有责任处置/关闭. publ
我试图传递流作为参数,但我不确定哪种方式是“最好的”所以我想听听你对我的代码示例的意见/建议

我个人更喜欢选项三,但我更新看到它在其他地方以这种方式完成.

选项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,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是将流的内容复制到另一个流 – 我没有看到这样做的任何好处.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读