Twoje pytanie, czy zawsze powinieneś dzwonić, Dispose
jest zwykle gorącą debatą. Zobacz ten blog, aby poznać ciekawą perspektywę szanowanych osób w społeczności .NET.
Osobiście uważam, że stanowisko Jeffreya Richtera, że sprawdzanie Dispose
nie jest obowiązkowe, jest niesamowicie słabe. Podaje dwa przykłady na uzasadnienie swojej opinii.
W pierwszym przykładzie mówi, że wywoływanie Dispose
kontrolek Windows Forms jest żmudne i niepotrzebne w głównych scenariuszach. Jednak nie wspomina, że Dispose
faktycznie jest wywoływana automatycznie przez kontenery kontrolne w tych głównych scenariuszach.
W drugim przykładzie stwierdza, że programista może błędnie założyć, że instancja from IAsyncResult.WaitHandle
powinna zostać agresywnie usunięta, nie zdając sobie sprawy, że właściwość leniwie inicjuje uchwyt oczekiwania, co skutkuje niepotrzebnym spadkiem wydajności. Ale problem z tym przykładem polega na tym, że IAsyncResult
sam w sobie nie jest zgodny z opublikowanymi przez Microsoft wytycznymi dotyczącymi postępowania z IDisposable
obiektami. Oznacza to, że jeśli klasa zawiera odniesienie do IDisposable
typu, to sama klasa powinna implementować IDisposable
. Gdyby postępowano IAsyncResult
zgodnie z tą zasadą, wówczas jego własna Dispose
metoda mogłaby podjąć decyzję dotyczącą tego, którego z jej członków należy usunąć.
Więc jeśli ktoś nie ma bardziej przekonujących argumentów, pozostanę w obozie „zawsze wzywaj utylizację” ze zrozumieniem, że będą pewne przypadki poboczne, które wynikną głównie ze złych wyborów projektowych.
using
konstrukcji.