Meine zwei Cent für schwache Referenzen in .Net

Der GC ist in der Lage, den von verwalteten Objekten belegten Speicher zurückzugewinnen. Sie sollten jedoch zusätzliche Maßnahmen ergreifen, um die Speicherbereinigung zu vereinfachen und die Leistung Ihrer Anwendungen zu verbessern.

Eine schwache Referenz ist eine Referenz, die auf ein Objekt im Speicher verweist und gleichzeitig dem Garbage Collector ermöglicht, das Objekt zu sammeln oder den vom Objekt belegten Speicher zurückzugewinnen, wenn der GC ausgeführt wird. Ein Objekt, das erreichbar ist, ist kein zur Laufzeit gesammelter Müll.

Sie können schwache Referenzen für Objekte verwenden, die viel Speicher verbrauchen. Wenn Sie schwache Referenzen für solche Objekte verwenden, aktivieren Sie die Speicherbereinigung dieser Objekte, während diese Objekte bei Bedarf später neu erstellt werden können. Wenn Sie also ein großes Objekt in Ihrer Anwendung haben, das Sie weniger häufig verwenden würden, können Sie einen schwachen Verweis auf solche Objekte verwenden, vorausgesetzt, die Neuerstellung solcher Objekte ist nicht so teuer.

Beachten Sie, dass beim Erstellen einer schwachen Referenz auf ein Objekt ein IntPtr für ein GCHandle intern von der von Ihnen erstellten schwachen Referenz gespeichert wird. Die Laufzeit verwendet dieses GCHandle, um eine Tabelle zu verwalten, die schwache Verweise auf Objekte enthält. Wenn für ein Objekt bereits Müll gesammelt wurde, lautet der Wert von IntPtr IntPtr.Zero. Wenn der schwache Verweis auf das Objekt abgeschlossen ist, wird der entsprechende Eintrag des schwachen Verweises auf das Objekt in der schwachen Referenztabelle entfernt. Wenn die schwache Referenz auf das Objekt noch aktiv ist und Sie die Target-Eigenschaft für die schwache Referenz aufrufen, wird das tatsächliche Objekt zurückgegeben, auf das der GCHandle der schwachen Referenz zeigt.

Das Erstellen eines schwachen Verweises auf ein Objekt erhöht nicht die Lebensdauer des Objekts. Dadurch kann der Garbage Collector den vom Objekt belegten Speicher zurückfordern, wenn keine starken Verweise auf dieses Objekt vorhanden sind. Der Unterschied zwischen einer schwachen und einer starken Referenz auf ein Objekt besteht darin, dass erstere dem Garbage Collector weiterhin erlauben, den von diesem Objekt belegten Speicher zurückzugewinnen, während eine starke Referenz auf ein Objekt dem Garbage Collector nicht erlaubt, den von ihm belegten Speicher zurückzugewinnen dieses Objekt, wenn das Objekt erreichbar ist.

Schwache Referenz in C # programmieren

Um eine schwache Referenz zu erstellen, müssten Sie die System.WeakReference-Klasse nutzen. Nachdem Sie eine schwache Referenz auf ein Objekt erstellt haben, können Sie mit der Target-Eigenschaft der von Ihnen erstellten schwachen Referenz überprüfen, ob das ursprüngliche Objekt noch aktiv ist. Das folgende Codeausschnitt zeigt, wie Sie einen schwachen Verweis auf ein Objekt erstellen können.

Rectangle rectangle = new Rectangle(15, 10);

var weakReference = new WeakReference(rectangle);

Mit der IsAlive-Eigenschaft können Sie überprüfen, ob der schwache Verweis auf das Objekt noch vorhanden ist. Hier ist eine Codeliste, die dies veranschaulicht.

static void Main(string[] args)

        {

            Rectangle rectangle = new Rectangle(15, 10);

            var weakReference = new WeakReference(rectangle);

            rectangle = null;

            bool isAlive = weakReference.IsAlive;

            if(isAlive)

            Console.WriteLine("The object is still alive");

            Console.Read();

        }

Wenn der starke Verweis auf das Objekt nicht mehr verfügbar ist, können Sie die Target-Eigenschaft des schwachen Verweises nutzen, um das Objekt wie im unten angegebenen Codeausschnitt gezeigt zu verwenden.

bool isAlive = weakReference.IsAlive;

if(isAlive)

{

Rectangle rectangle = weakReference.Target as Rectangle;

//You can now use the rectangle object as usual

}

Kurz- und langlebige schwache Referenzen

Schwache Referenzen können entweder kurzlebig oder langlebig sein. Der Hauptunterschied zwischen kurzer und schwacher Referenz besteht darin, dass im ersteren Fall die Target-Eigenschaft der schwachen Referenz null wird, wenn der GC das Objekt zurückerobert, im letzteren Fall die lange schwache Referenz auch nach dem Ausführen des GC lebendig bleibt, d. H. überlebt einen GC-Zyklus. Beachten Sie, dass Sie lange schwache Referenzen mit Vorsicht verwenden sollten, da der Status des Objekts nach der Finalisierung nicht vorhergesagt werden kann.

Im Wesentlichen sollten Sie kurze schwache Referenzen verwenden, wenn Sie ein Objekt verwenden möchten, das sich in einem verwendbaren Zustand befindet. Im Gegenteil, eine lange schwache Referenz ist eine gute Wahl, wenn Sie das Objekt unabhängig von seinem Zustand verwenden möchten. Um eine lange schwache Referenz zu erstellen, müssen Sie beim Erstellen der schwachen Referenz "true" als zweiten Parameter an den überladenen Konstruktor der WeakReference-Klasse übergeben. Das folgende Codefragment veranschaulicht dies.

Rectangle rectangle = new Rectangle(15, 10);

var weakReference = new WeakReference(rectangle, true);