Udostępnij za pośrednictwem


Słabe odwołania

Moduł odśmiecający śmieci nie może zebrać obiektu używanego przez aplikację, gdy kod aplikacji może dotrzeć do tego obiektu. Mówi się, że aplikacja ma silne odwołanie do obiektu.

Słabe odwołanie pozwala modułowi odśmiecać odśmiecenie obiektu, jednocześnie zezwalając aplikacji na dostęp do obiektu. Słabe odwołanie jest prawidłowe tylko w czasie nieokreślonym, dopóki obiekt nie zostanie zebrany, gdy nie istnieją silne odwołania. Jeśli używasz słabego odwołania, aplikacja nadal może uzyskać silne odwołanie do obiektu, co uniemożliwia zbieranie. Jednak zawsze istnieje ryzyko, że moduł odśmiecenia pamięci trafi do obiektu jako pierwszy, zanim zostanie ponownie nawiązane silne odwołanie.

Słabe odwołania są przydatne w przypadku obiektów korzystających z dużej ilości pamięci, ale można je łatwo odtworzyć, jeśli są odzyskiwane przez odzyskiwanie pamięci.

Załóżmy, że widok drzewa w aplikacji Windows Forms wyświetla złożony hierarchiczny wybór opcji dla użytkownika. Jeśli dane bazowe są duże, utrzymywanie drzewa w pamięci jest nieefektywne, gdy użytkownik jest zaangażowany w coś innego w aplikacji.

Gdy użytkownik przełącza się do innej części aplikacji, możesz użyć WeakReference klasy , aby utworzyć słabe odwołanie do drzewa i zniszczyć wszystkie silne odwołania. Gdy użytkownik przełączy się z powrotem do drzewa, aplikacja próbuje uzyskać silne odwołanie do drzewa i, jeśli się powiedzie, unika rekonstrukcji drzewa.

Aby ustanowić słabe odwołanie do obiektu, należy utworzyć WeakReference przy użyciu wystąpienia obiektu do śledzenia. Aby zapoznać się z przykładem kodu, zobacz WeakReference w bibliotece klas.

Krótkie i długie słabe odwołania

Można utworzyć krótkie słabe odwołanie lub długie słabe odwołanie:

  • Krótkie

    Element docelowy krótkiego słabego odwołania staje się null wtedy, gdy obiekt jest odzyskiwane przez odzyskiwanie pamięci. Słabe odwołanie jest samym obiektem zarządzanym i podlega wyrzucaniu elementów bezużytecznych, podobnie jak w przypadku każdego innego zarządzanego obiektu. Krótkie słabe odwołanie jest konstruktorem bez parametrów dla .WeakReference

  • Długi

    Długie słabe odwołanie jest zachowywane po wywołaniu metody obiektu Finalize . Umożliwia to ponowne utworzenie obiektu, ale stan obiektu pozostaje nieprzewidywalny. Aby użyć długiego odwołania, określ true w konstruktorze WeakReference .

    Jeśli typ obiektu nie ma Finalize metody, ma zastosowanie krótka słaba funkcja odwołania i słabe odwołanie jest prawidłowe tylko do momentu zebrania obiektu docelowego, który może wystąpić w dowolnym momencie po uruchomieniu finalizatora.

Aby ustanowić silne odwołanie i ponownie użyć obiektu, rzutuj Target właściwość obiektu WeakReference na typ obiektu. Target Jeśli właściwość zwróci nullwartość , obiekt został zebrany. W przeciwnym razie można nadal używać obiektu, ponieważ aplikacja odzyskała silne odwołanie do niego.

Wskazówki dotyczące używania słabych odwołań

Użyj długich słabych odwołań tylko wtedy, gdy jest to konieczne, ponieważ stan obiektu jest nieprzewidywalny po finalizacji.

Unikaj używania słabych odwołań do małych obiektów, ponieważ sam wskaźnik może być tak duży lub większy.

Unikaj używania słabych odwołań jako automatycznego rozwiązania problemów z zarządzaniem pamięcią. Zamiast tego opracuj obowiązujące zasady buforowania do obsługi obiektów aplikacji.

Zobacz też