Destruktory rzadko są używane w C#, więc wiele osób o nich zapomniało, choć są niewiele przydatne i bezużyteczne do nauki.
Jeden. Charakterystyka niszczycieli:
Destruktorzy mogą istnieć tylko w klasach, a nie w strukturach; Destruktor nie może mieć żadnych modyfikatorów, w tym modyfikatorów kontroli dostępu, statycznych, abstrakcyjnych, wirtualnych itd.; Niszczyciel nie ma żadnych parametrów, co oznacza, że nie może być przeciążenia.
Dwa. Kiedy wezwać niszczyciela:
Destruktor jest wzywany, gdy obiekt jest recyklingowany przez garbage collector, ale garbage collector ma cechę: jest leniwy, Nie recyklinguje zmiennej bezpośrednio po jej opuszczeniu zakresu i czasie życia, lecz tylko wtedy, gdy uzna to za odpowiednie, zwykle gdy pamięć jest ograniczona. Na przykład:
Po zwróceniu metody btn_Click de powinno zostać zakończone, ale jego destruktor nie jest wywoływany, co wskazuje, że garbage collector nie poddał go recyklingowi; Po zamknięciu formularza destruktor zostaje wykonany, co oznacza, że na końcu programu garbage collector jest niechętnie zmuszony do jego recyklingu (^-^). Oczywiście możemy zadzwonić do GC.Collect(), aby wymusić recykling:
Gdy klikasz btn1, de1 i nowy Demo() zostają zakończone, a destruktor jest wywoływany. de2 nie wygasł jeszcze okresu użytkowania, więc nawet jeśli zostanie wywołana metoda GC.Collect, nie zostanie poddana recyklingowi; gdy btn1_Click wraca, de2 wygasł swój okres życia, ale z powodu leniwości śmieciarza nadal nie jest poddawany recyklingowi; Dopiero gdy btn2 wywoła metodę GC.Collect, de2 zostaje odzyskane i wywołany jest jego niszczyciel.
Jednym ze sposobów zapobiegania wywołaniom destruktorów jest implementacja interfejsu IDisposable, który definiuje unikalną metodę: Dispose(). To zapobiega wewnętrznemu wywoływaniu destruktora, co oznacza, że jeśli się nudzisz, możesz zaimplementować ten interfejs bez wywoływania GC.SuppressFinalize(^-^), co jest bezsensowne, ponieważ nie blokuje destruktora:
Teraz destruktor de1 nie zostanie wywołany.
Trzy. Istota niszczyciela:
Destruktor to zasadniczo metoda przyjmująca postać:
Zazwyczaj uważamy, że destruktory mogą być wywoływane tylko przez system, a nie przez samych programistów, ale nie jest to do końca prawda, a destruktory można również nazywać wprost, w końcu to tylko metoda:
Destruktory nie są wymagane, chyba że w klasie otworzą się niezarządzane zasoby
|