Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 20506|Odpowiedź: 1

[Źródło] C# Deep Dive - Destructors

[Skopiuj link]
Opublikowano 17.08.2018 13:54:43 | | |
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





Poprzedni:C# Distinct warunkowo deduplikuje obiekty
Następny:Wiadomość wyjątku: "StrongTypingException: IsPrima...
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com