Istnieje wiele pytań, w których można znaleźć wykrywanie wycieku obiektów IDisposable. Wygląda na to, że odpowiedź brzmi: "you can't".Wykrywanie "wyciekanych" obiektów IDisposable
Właśnie sprawdziłem z najbardziej trywialnym przypadkiem testowym, że FxCop 10.0 tego nie robi, ReSharper 4 z MSVS2010 tego nie robi.
Wydaje mi się to niewłaściwe, gorsze niż wycieki pamięci w C (dla których przynajmniej stworzyliśmy narzędzia do wykrywania).
Myślałem: Czy to możliwe, używając refleksji i innych niejasnych zaawansowanych technik, które mogę wprowadzić w runtime, w finalizatorze, aby sprawdzić, czy został wywołany Dispose
?
Co powiecie na magiczne sztuczki z WinDBG + SOS?
Nawet jeśli nie ma na to narzędzi, chciałbym się dowiedzieć, czy jest to teoretycznie możliwe (moje C# nie jest zbyt ostre).
Pomysły?
UWAGA Tytuł tego pytania mógł być mylący. Prawdziwym pytaniem tutaj powinno być , czy obiekt IDisposable
został odpowiednio Disposed()
. Pozbycie się przez GC nie liczy się, ponieważ uważam to za błąd.
Edytuj: Rozwiązanie: .NET Profiler Memory wykonuje zadanie. Po zakończeniu programu musimy po prostu spisać kilka GC.Collect()
, aby nasz profiler mógł poprawnie pobrać statystyki.
Powodem, dla którego istnieją narzędzia dla C++, ale może nie dla C# jest to, że zasoby w C# są zasadniczo różne, ponieważ zasoby niezarządzane * nie są już powiązane z czasem życia obiektu *. Co można prześledzić, zarówno w języku C#, jak i C++, to czas życia obiektu i to, czy obiekt został właściwie usunięty. Jednak zasoby jednorazowe w języku C# nie są w żaden sposób związane z obiektem życia, co powoduje, że śledzenie ich jest znacznie trudniejsze. Aby porównać, spróbuj śledzić wyciek zasobów GDI, które nie są powiązane przez RAII do czasu życia obiektu w C++. Nie tak łatwo. –
Trochę się nad tym zastanawiam. Rozwinąłem nawyk szybkiego sprawdzania typów podczas pisania kodu, aby sprawdzić, czy odziedziczą po 'IDisposable'. Jeśli to zrobię, zawijam je w 'użyciu' w zakresie, w jakim muszą żyć. Nie działa on dla istniejącego kodu, ale pomyślałem, że o tym wspomnę. –
Zobacz ten wpis, w którym można użyć analizy kodu programu Visual Studio w celu wykrycia problemów z iDisposable w czasie kompilacji: http://stackoverflow.com/a/6213977/2862 –