Próbowałem przekazać strumień jako argument, ale nie jestem pewien, która droga jest "najlepsza", dlatego chciałbym usłyszeć Twoją opinię/sugestie na temat mojej próbki koduJaki jest najlepszy sposób przekazania strumienia wokół numeru
Ja osobiście wolę opcje trzy, ale nowsze widziałem, jak to robiono w ten sposób gdziekolwiek indziej.
Wariant 1 jest dobre dla małych strumieni (i strumieni o znanej wielkości)
Option 2_1 i 2_2 zawsze opuścić „zakręt” wątpliwości, kto jest odpowiedzialny za zbywanie/zamykania.
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);
}
}
Opcja 3 po prostu używa "MemoryStream" jako sposobu, aby móc przekonwertować strumień na tablicę bajtów. - Więc nie jest to kwestia parsowania treści strumienia do innego strumienia. –
Aby było jasne; jeśli zostaniesz poproszony o wstawienie "void HandleStream (Stream stream);" zakładasz, że twoja implementacja nie była odpowiedzialna za zamknięcie/usunięcie strumienia? –
@JakobDyrby - Mimo wszystko, Opcja 3 czyta z "Stream", pisząc do 'MemoryStream' i konwertując na' byte [] '. Czemu po prostu nie czytać z 'Stream' i nie używać bufora? – dcastro