Wpis z mikrobloga

#pytanie #csharp #dotnet #programowanie
Ktoś mi wytłumaczy w jakim celu usuwa się zarządzane zasoby w dispose pattern tylko w przypadku wywołania Dispose() ale nie usuwa się ich w finalizerze/destruktorze? Przecież one tak czy siak zostaną usunięte przez grabarza. Czy chodzi o to, żeby nikt nie odwoływał się gdzieś w kodzie do tych zasobów już po wywołaniu dispose (bo obiekt jest już wyczyszczony i nie powinien być używany) ?
LeopoldStuff - #pytanie #csharp #dotnet #programowanie
Ktoś mi wytłumaczy w jakim ce...

źródło: comment_yZDi1XzalqXp5Oxqj0QJIhZCi8TdBMzE.jpg

Pobierz
  • 9
@M4ks: czyli chodzi o to, żeby po wywołaniu metody dispose na obiekcie nie było możliwości odwoływania się już do czegokolwiek co znajduje się w tym obiekcie (bo w zamierzeniu nie powinien być on już używany), tak?
@damyrade: Pytałem się o ZARZĄDZANE zasoby. Wiem po co jest dispose dla niezarządzanym zasobów. W przykładzie który wkleiłem powyżej czyści się także ZARZĄDZANE zasoby tylko w przypadku gdy faktycznie dispose jest wywołany. Ale prawdopodobnie mój drugi komentarz jest odpowiedzią tylko jakoś nikt nie może tego potwierdzić/zaprzeczyć
@LeopoldStuff: Chodzi o to, że GC sam decyduje w jakiej kolejności i kiedy zniszczyć obiekty. W związku z tym nigdy nie powinieneś odnosić się do innych zarządzanych obiektów w finalizerze, bo część z nich może już nie istnieć i to może wywalić całą aplikację.

Taka dodatkowa uwaga: jeśli masz taką możliwość, to nie dopuść do wywołania kodu finalizera ponieważ obiekty oznaczone do zfinalizowania przenoszą się o generacje wyżej przez co żyją
@extern-int: Aaaa - teraz jasne. Czuli schemat działania jest taki:
1. Normalne użycie - wywołany jest Dispose() który czyści zarządzane i niezarządzane zasoby i ponieważ jest także wywołana metoda GC.SuppressFinalize to tak naprawdę finalizer już nie będzie wywołany przez grabarza
2. Użycie gdy ktoś zapomni wywłać dispose albo opakować w using - wtedy finalizer jest wywołany przez grabarza i on sam już czyści sobie zarządzane zasoby