Mam klasę, która zasadniczo opakowuje strumień do odczytu/zapisu, ale strumień ten będzie zarządzany przez konsumenta tej klasy. Dla ułatwienia użycia używam klas StreamReader i StreamWriter do wykonywania operacji we/wy w strumieniu. Normalnie otwieram czytnik i program piszący w blokach using
, ale chcę uniknąć zamykania czytnika i programu piszącego, ponieważ spowoduje to również zamknięcie strumienia bazowego i muszę go zachować.Czy nie należy zamykać StreamReader/StreamWriter, aby utrzymać otwarty strumień?
Czy bezpieczne jest zarządzanie pamięcią/zasobami, aby nie zamykać StreamReader/StreamWriter, jeśli oczekuję, że bazowy strumień będzie zarządzany przez osobę dzwoniącą? Czy czytelnik i pisarz będą zbierać śmieci, gdy strumień zostanie jawnie zamknięty w innym miejscu?
public class Wrapper
{
private Stream _underlyingStream;
public Wrapper(Stream underlyingStream)
{
_underlyingStream = underlyingStream;
}
public string GetValue()
{
_underlyingStream.Seek(0, SeekOrigin.Begin);
var reader = new StreamReader(_underlyingStream);
return reader.ReadToEnd(); // we're done, but the stream is not ours to close
}
}
To pytanie może pomóc: http://stackoverflow.com/questions/1862261/can-you-keep-a-readreader-from-disposing-the-basis-stream –
Nie związane z pytaniem, ale ponieważ opakowanie nie "jest właścicielem" strumienia, możesz również zapisać oryginalny '_underlyingStream.Position' i przywróć go do tej pozycji po ReadToEnd() przed powrotem do wywołującego. (Chociaż twoje użycie może być takie, że rozmówca spodziewa się, że pozycja zostanie dotknięta takim wezwaniem - i może zapisać pozycję, jeśli to ma znaczenie.) –