Wzorzec .NET IDisposable oznacza, że jeśli napiszesz finalizator i zaimplementujesz IDisposable, finalizator musi jawnie wywołać Dispose. Jest to logiczne i zawsze to robiłem w rzadkich sytuacjach, gdy finalizator jest uzasadniony.
Jednak co się stanie, jeśli po prostu to zrobię:
class Foo : IDisposable
{
public void Dispose(){ CloseSomeHandle(); }
}
i nie implementuj finalizatora ani nic takiego. Czy struktura wywoła za mnie metodę Dispose?
Tak, zdaję sobie sprawę, że to brzmi głupio i cała logika sugeruje, że tak nie będzie, ale zawsze miałem dwie rzeczy z tyłu głowy, które sprawiały, że nie byłem pewien.
Ktoś kilka lat temu powiedział mi kiedyś, że rzeczywiście tak się stanie, a ta osoba miała bardzo solidne doświadczenie w „znajomości swoich rzeczy”.
Kompilator / framework wykonuje inne „magiczne” rzeczy w zależności od tego, jakie interfejsy zaimplementujesz (np. Foreach, metody rozszerzające, serializacja oparta na atrybutach itp.), Więc ma sens, że może to być również „magiczne”.
Chociaż czytałem wiele rzeczy na ten temat i było wiele sugestii, nigdy nie byłem w stanie znaleźć ostatecznej odpowiedzi Tak lub Nie na to pytanie.