Я попытался передать поток в качестве аргумента, но я не уверен, какой путь является «лучшим», поэтому хотел бы услышать ваше мнение/предложения по моему образцу кодаКаков наилучший способ передать поток
Я лично предпочитаю варианты три, но я видел, как это делается в другом месте.
Вариант 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);
}
}
Вариант 3 просто использует «MemoryStream» как средство, позволяющее преобразовать поток в массив байтов. - Таким образом, это не вопрос разбора потока контента другому потоку. –
Итак, чтобы быть ясным; если вы попросили ввести «void HandleStream (поток потока)»; вы предположили бы, что ваша реализация не несет ответственности за закрытие/удаление потока? –
@JakobDyrby - Тем не менее, вариант 3 читается из «Потока», записывается в «MemoryStream» и преобразуется в 'byte []'. Почему бы просто не читать из «Потока» и использовать буфер? – dcastro