Kann jemand die Hauptvorteile verschiedener Arten von Referenzen in C # erklären?
- Schwache Referenzen
- Weiche Referenzen
- Phantomreferenzen
- Starke Referenzen.
Wir haben eine Anwendung, die viel Speicher verbraucht, und wir versuchen festzustellen, ob dies ein Bereich ist, auf den wir uns konzentrieren müssen.
Antworten:
Ich glaube, Soft- und Phantomreferenzen stammen aus Java. Eine lange schwache Referenz (die dem WeakReference-Konstruktor von C # entspricht) kann als ähnlich wie die PhantomReference von Java angesehen werden. Wenn es in C # ein Analogon zu SoftReference gibt, weiß ich nicht, was es ist.
Schwache Referenzen verlängern nicht die Lebensdauer eines Objekts und ermöglichen so die Müllabfuhr, sobald alle starken Referenzen den Gültigkeitsbereich überschritten haben. Sie können nützlich sein, um an großen Objekten festzuhalten, deren Initialisierung teuer ist, die jedoch für die Speicherbereinigung verfügbar sein sollten, wenn sie nicht aktiv verwendet werden.
Ob dies zur Reduzierung des Speicherverbrauchs Ihrer Anwendung hilfreich ist oder nicht, hängt vollständig von den Besonderheiten der Anwendung ab. Wenn beispielsweise eine moderate Anzahl von zwischengespeicherten Objekten herumhängt, die möglicherweise in Zukunft wiederverwendet werden oder nicht, können schwache Referenzen dazu beitragen, den Speicherverbrauch der Caches zu verbessern. Wenn die App jedoch mit einer sehr großen Anzahl kleiner Objekte arbeitet, verschlimmern schwache Referenzen das Problem, da die Referenzobjekte mindestens so viel Speicherplatz beanspruchen.
quelle
MSDN hat eine gute Erklärung für schwache Referenzen . Das Schlüsselzitat befindet sich unten, wo es heißt:
Jedes Mal, wenn ich eine WeakReference in freier Wildbahn gesehen habe, wurde sie als automatische Lösung für Speicherverwaltungsprobleme verwendet. Es gibt wahrscheinlich bessere Lösungen für die Probleme Ihrer Anwendung.
quelle
I see no use at all for weak references
Bis Sie einen Speicherverlust in Ihrer GC-fähigen Laufzeit haben, weil irgendwo im Code ein Verweis auf einen Baumknoten vorhanden ist, der den gesamten Baum referenziert und somit keinen Müll sammelt, obwohl er nicht mehr verwendet wird . Die WeakReference wird als schwache Referenz verwendet (Wortspiel beabsichtigt): " Wenn das Objekt noch verwendet wird, möchte ich in der Lage sein, etwas damit zu tun, aber wenn es nicht mehr vorhanden ist, möchte ich keinesfalls das sein." eine, um es am Leben zu erhalten. "Es ist Code-Hygiene, die das Eigentum oder Nicht-Eigentum an einem Objekt bestimmt.Ein brillantes Beispiel mit WeakReference wird im Android-Entwicklungs-Tutorial erklärt .
In der Ansicht (ImageView) befinden sich ein Bild (Bitmap) und ein Bildcontainer. Wenn das Bild nicht aus dem Speicher (sondern z. B. von der Festplatte, dem Netz) geladen wird, kann es den UI-Thread und den Bildschirm sperren. Um dies zu vermeiden, kann eine asynchrone Aufgabe verwendet werden.
Das Problem tritt auf, wenn die asynchrone Aufgabe beendet ist. Der Bildcontainer kann zu diesem Zeitpunkt überhaupt nicht nützlich sein (Bildschirm wird geändert oder Android entlädt nach dem Scrollen den unsichtbaren Ansichtsteil). WeakReference kann hier helfen und ImageView wird Müll gesammelt.
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { private final WeakReference<ImageView> imageViewReference; public BitmapWorkerTask(ImageView imageView) { imageViewReference = new WeakReference<ImageView>(imageView); } // Method for getting bitmap is removed for code clearness // Once complete, see if ImageView is still around and set bitmap. @Override protected void onPostExecute(Bitmap bitmap) { if (imageViewReference != null && bitmap != null) { final ImageView imageView = imageViewReference.get(); if (imageView != null) { imageView.setImageBitmap(bitmap); } } } }
PS Das Beispiel ist in Java, kann aber von C # -Entwicklern verstanden werden.
Quelle: http://developersdev.blogspot.ru/2014/01/weakreference-example.html
quelle