2009-07-10 15 views
6

Czytając o Dispose pattern, widzę dokumentację wielokrotnie odnoszą się do "czyszczenia zarządzane i niezarządzanego kodu". W kanonicznej implementacji metody Dispose widzimy określone przepływy (w zależności od tego, czy disposing jest prawdą czy fałszem) przeznaczone do czyszczenia zarządzanych obiektów w porównaniu do niezarządzanych obiektów.Usunięcie wzorca: Skąd mam wiedzieć, co jest zarządzane, a co niezarządzane?

Ale czy ja, skromny początkujący, wiem, które typy są zarządzane i które są niezarządzane?

Odpowiedz

3

Krótka wersja to: wszystko, co implementuje także IDisposable, musi zostać wywołane w Twojej metodzie Dispose. FxCop powie Ci również, jeśli czegoś nie pamiętasz (lub w ogóle nie używasz IDisposable, kiedy powinieneś być).

+0

Chociaż to naprawdę nie odpowiada na pytanie, nie jestem już przekonany, że istnieje dobra odpowiedź. Zapewnia to najlepsze praktyczne rozwiązanie problemów, które powstają, gdy programista nie może dokonać oceny dotyczącej "zarządzania" typem, ale myślę, że programista, który chce ostatecznej heurystyki dla dokonania tego osądu, jest po prostu szczęśliwy. –

0

Jeśli nie wiesz, typy, z których korzystasz, są prawdopodobnie zarządzane.

Typy niezarządzane dotyczą typów, które nie są bezpieczne, tj. Nie są zgodne z wymaganiami bezpieczeństwa CLR.

Great definition linked:

Aktualizacja

ja nie rozumiem downvote? Pytanie brzmiało w szczególności, jak rozróżnić typy zarządzane i niezarządzane?

Wszystkie inne odpowiedzi dotyczyły pytania IDispose, a nie zarządzanego/niezarządzanego pytania !?

Aktualizacja 2

Wciąż nie wyjaśniono drugiego downvote ...

zgadzam, obiekt IDisposable zawsze należy wyrzucać, ale to nie jest odpowiedź na pytanie, udało vs niezarządzalny .

+0

Podobny do mojego drugiego komentarza, skąd możesz wiedzieć, że typ, jak mówisz, nie jest zgodny z wymaganiami bezpieczeństwa CLR? To znaczy.gdybym miał napisać wtyczkę Reflector, aby zgłosić "nieuporządkowanie" wybranego typu, co by moja wtyczka sprawdzała na tym typie, aby dokonać ostatecznej oceny? –

0

Proponuję po prostu zniszczyć wszystkie zasoby po ich użyciu. Wszystko, co zwykle zależy od zasobu systemowego, takiego jak gniazda i zasoby strumieniowe, które chcesz jawnie zwolnić. W razie wątpliwości należy zrzucić i zutylizować. Pozwala zaoszczędzić wiele problemów związanych z debugowaniem w dłuższej perspektywie. Zwykle, gdy wywołujesz kod, który nie jest napisany w .NET, możesz założyć, że nie jest to "zarządzany kod".

2

Zarządzane lub niezarządzane tak naprawdę nie ma znaczenia. Jeśli klasa implementuje interfejs IDisposable, powinieneś wywołać Dispose(), gdy skończysz z obiektem. Alternatywnie (najlepiej) użyj funkcji using statement, aby wywołać funkcję Dispose() automatycznie, gdy obiekt znajdzie się poza zasięgiem.

@ Rob:
Odpowiedź jest wciąż taka sama. Jeśli twoja klasa zarządza jakimikolwiek wewnętrznymi obiektami, które implementują IDisposable, to powinna również implementować IDisposable. W swojej metodzie Dispose() wywołaj Dispose na tych obiektach.

+0

Myślę, że pytanie było pytaniem z perspektywy projektowania IDisposables - tj. Tego, co powinno i nie powinno być zwalniane, gdy dysponujemy a finalizujemy. – Rob

+1

@Thorarin - Wydaje mi się, że Rob Robi to, że jeśli zastosujesz klasyczny wzór dispose, masz flagę isDisposing, która wskazuje, czy jest wyrzucana z powodu wezwania do usunięcia, lub z powodu wykonania finalizatora. W tym drugim przypadku trzeba uważać, aby nie usuwać innych zarządzanych obiektów, ponieważ mogły one już zostać zebrane. W przypadku jawnego wywołania metody Dispose() można bezpiecznie je usunąć. Zasób * niezarządzany * powinien być jednak usuwany w obu przypadkach. –

+0

Mam tendencję do podejścia Gestapo do tego: jeśli wywołanie finalizatora jest w ogóle, głośno narzekaj programistom, aby naprawili swój kod. – Thorarin

5

Niezarządzane oznacza obiekty macierzyste Win32, głównie uchwyty; i odniesienia do surowych obiektów COM. Są to zasoby, które nie są kontrolowane przez (lub zarządzane przez) .NET CLR.

+0

Dobrze, ale jak deweloper strict.NET zbyt młody, by używać Win32, COM, itp. * Wiem * że zasób nie jest pod kontrolą CLR, albo gorzej, * zależy * od zasobu, który nie jest pod kontrolą CLR? Mam na myśli, w jaki sposób * wiesz *, że, powiedzmy, uchwyt jest niezarządzany? Prawdopodobnie doświadczenie. Ale w przypadku braku tego doświadczenia, jak jest bardziej przyjazny dla środowiska programista, aby za każdym razem dobrze to ująć? Uważam, że obecność, powiedzmy, interfejsu IDisposable nie wystarczy; przeciętny programista nie nauczy się sprawdzać dokumentacji każdego typu, aby wymienić IDisposable. –

+1

Mówię coś przeciwnego. Jeśli istnieje IDisposable, zutylizuj. Kropka. W ten sposób czuła młodzież nigdy nie powinna być narażona na traumę COM. –

Powiązane problemy