Zwracanie obiektów IDisposable czy Strumieni z metody - jak z tym jest w C#?

0

Cześć - chodzi mi o odpowiedzialność za obiekt w przypadku gdy jest on IDisposable i jest zwracany z metody

chcę zrobić cos takiego - w przybliżeniu

interface IReader
{
    StreamReader Read(T data); //T np nazwa pliku lub memory stream
}

class Reader ; IReader
{
    public StreamReader Read(T data)
    {
       return new StreamReader(data);
    }
}

//gdzieś w kodzie
using var sr = _reader,read(fileName);

czy to jest po C#-owemu?
tak to się robi?
bo tu trochę może uciec kto jest odpowiedzialny za disposowanie obiektu, reader czy klasa/metoda korzystająca z readera?

0

Nie znam kontekstu, więc piszę o tym, co widzę. Możesz dać wybór, w stylu:

StreamReader reader;
public StreamReader Read(T data, bool ownsReader)
{
  if(ownsReader)
  {
      reader = new StreamReader(data);
      return reader;
  } else
    return new StreamReader(data);
}

W tym wypadku programista sam decyduje, kto jest odpowiedzialny za zwolnienie zasobów. Jeśli ownsReader jest true, wtedy zwolnić powinien Twój obiekt. Dobrze by było, żeby on też implementował wtedy IDisposable. Jednak robiąc coś takiego:

using(var sr = reader.Read(data))
{
  sr...
}

jest to jak najbardziej poprawne.
Zresztą możesz dać w dokumentacji, że metoda Read zwraca readera, za którego zwolnienie odpowiedzialny jest caller. I jest to też normalne zachowanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1