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

前端之家收集整理的这篇文章主要介绍了c# – 传递流的最佳方式是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图传递流作为参数,但我不确定哪种方式是“最好的”所以我想听听你对我的代码示例的意见/建议

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

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

原文链接:https://www.f2er.com/csharp/100070.html

猜你在找的C#相关文章