2010-10-08 5 views
8

Kolega z mojej kopalni twierdzi, że w języku C#, który ma statyczne elementy w klasach niestatycznych, zapobiega przypadkom, w których te klasy są wciąż gromadzone podczas zbierania śmieci i że jest to wspólne źródło Wycieki pamięci C#. W wyniku tego zawsze owija statyczne elementy w statyczną klasę i uzyskuje do nich dostęp stamtąd za pośrednictwem statycznej właściwości lub metod na tej klasie statycznej. Zawsze uważałem, że statyka była na stosie, a nie na stertach, więc nie miało to nic wspólnego ze zbiorem śmieci. Nie wydaje mi się to właściwe.Pytanie o statyczne elementy wewnątrz klas niestatycznych i zbieranie śmieci

Jaka jest prawda?

Odpowiedz

11

Nie wie, o czym mówi. Członkowie statyczni wewnątrz klasy niestatycznej wykonują numer , a nie, aby zapobiec gromadzeniu śmieci w instancjach klasy.

Mimo to statystyka może znajdować się na stosie lub sterty. Nie ma znaczenia dla zbierania śmieci. Ważne jest to, że statyczne części typu nie są przechowywane wraz z wystąpieniami typu.

0

Przyjaciel jest niepoprawny.

Ideą metody statycznej jest brak instancji tej klasy. Nic więc nie istnieje, by zbierać śmieci.

Spróbuj umieścić wewnątrz statycznej metody w klasie niestatycznej i zobacz, co się stanie.

5

Członki statyczne są podstawami dla GC. Wszelkie odniesienia do statycznych elementów będą utrzymywane przy życiu. To, czy odniesienie statyczne znajduje się w klasie statycznej, czy w klasie niestatycznej, nie ma znaczenia.

Jeśli masz klasę niestatyczną, która ma pole statyczne, a masz instancje tej klasy, to pole statyczne nie ma wielu instancji - jest to część definicji statycznej - nie jest to pole na jedno wystąpienie . Więc czy klasa sama w sobie jest statyczna czy nie robi żadnej różnicy.

Tak, odniesienia statyczne są często przyczyną wycieków pamięci, zwłaszcza zdarzeń statycznych, których nie anulowano, kiedy jest to właściwe. Zmiana klasy na statyczną nie rozwiąże wycieku pamięci - musisz usunąć statyczne odwołanie, gdy zakończy się okres działania instancji, do której się odnosi. Często odbywa się to za pomocą Dispose() ing obiektu i posiadając Dispose wyczyścić subskrypcję referencji/zdarzenia.

This to dobre miejsce, aby dowiedzieć się więcej o tym, jak działa GC, jak identyfikuje śmieci i co z tym robi. Jak również Finalizatory i więcej ...