传送流的最佳方法是什么

问题描述 投票:11回答:3

我尝试将流作为参数传递,但是我不确定哪种方法是“最好的”,所以希望听到您对我的代码示例的意见/建议

我个人更喜欢选项3,但我从未在其他任何地方看到过这种方法。

选项1适用于小型流(以及已知大小的流)

选项2_12_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);
    }
}
c# stream arguments
3个回答
3
投票

选项2_2是处理可处理资源的标准方法。


1
投票

您可能没有意识到,但是您正在尝试实现管道设计模式


0
投票

绕过IStream,并且无论流起源于何处都实现IDisposable。处理流的责任在于创建流的对象。

© www.soinside.com 2019 - 2024. All rights reserved.