流我試圖通過流作爲參數的最佳方式,但我不知道哪條路是「最好的」,所以想聽聽你的意見/建議到我的代碼示例什麼是繞過
我個人更喜歡選項三,但我更新的地方在其他任何地方都是這樣做的。
選項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」作爲能夠將流轉換爲字節數組的手段。 - 所以這不是將流內容解析到另一個流的問題。 –
所以要清楚;如果你在哪裏要求impliment「void HandleStream(Stream stream);」你會認爲你的實現沒有責任關閉/處置流? –
@JakobDyrby - 然而,選項3正在讀取'Stream',寫入'MemoryStream',並轉換爲'byte []'。爲什麼不直接從'Stream'讀取並使用緩衝區呢? – dcastro