Die einzige Möglichkeit zu erreichen, was Sie suchen, ist eine statische Liste dieser Objekte in der Klasse selbst zu halten. Wenn Sie nur sehen möchten, ob irgendwo eine Instanz vorhanden ist, die nicht als Garbage Collection erfasst wurde, sollten Sie die Klasse WeakReference
verwenden. Zum Beispiel ...
public class MyClass
{
private static List<WeakReference> instances = new List<WeakReference>();
public MyClass()
{
instances.Add(new WeakReference(this));
}
public static IList<MyClass> GetInstances()
{
List<MyClass> realInstances = new List<MyClass>();
List<WeakReference> toDelete = new List<WeakReference>();
foreach(WeakReference reference in instances)
{
if(reference.IsAlive)
{
realInstances.Add((MyClass)reference.Target);
}
else
{
toDelete.Add(reference);
}
}
foreach(WeakReference reference in toDelete) instances.Remove(reference);
return realInstances;
}
}
Da Sie OO neu sind/.NET, lassen Sie sich nicht die WeakReference
Verwendung abschrecken. Die Art der Speicherbereinigung funktioniert durch Referenzzählung.Solange ein Teil des Codes oder eines Objekts Zugriff auf eine bestimmte Instanz hat (dh es liegt innerhalb des Bereichs als Teil einer lokalen, Instanz oder statischen Variable), wird dieses Objekt als lebendig betrachtet. Sobald diese Variable außerhalb des Gültigkeitsbereichs liegt, kann/wird der Müllsammler sie irgendwann sammeln. Wenn Sie jedoch eine Liste aller Referenzen verwalten würden, würden sie niemals außerhalb des Gültigkeitsbereichs fallen, da sie als Referenzen in dieser Liste existieren würden. Die WeakReference
ist eine spezielle Klasse ermöglicht es Ihnen, einen Verweis auf ein Objekt beizubehalten, das der Garbage Collector ignoriert. Die Eigenschaft IsAlive
gibt an, ob WeakReference
auf ein gültiges Objekt verweist, das noch vorhanden ist.
Also, was wir hier tun, ist diese Liste der WeakReference
s halten, die für jede Instanz von MyClass
verweisen, die erstellt worden ist. Wenn Sie eine Liste von ihnen erhalten möchten, durchlaufen wir unsere WeakReference
s und schnappen alle von ihnen, die lebendig sind. Irgendwelche, die nicht mehr am Leben sind, werden in eine andere temporäre Liste gesetzt, so dass wir sie aus unserer äußeren Liste löschen können (so dass die Klasse WeakReference
selbst gesammelt werden kann und unsere Liste ohne Grund nicht riesig wächst).
Das zählt die Anzahl der Variablen, nicht die Anzahl der Instanzen der Klasse ... –
@Adam: Wenn der Beitrag überhaupt nicht eindeutig ist, müssen Sie einige Dinge erraten. Deshalb habe ich es mit "Ich bin mir nicht ganz sicher, was du meinst" vorangestellt. Es ist richtig, die Anzahl der lokalen Variablen zu zählen, was entweder eine Antwort auf das OP oder ein Hinweis darauf ist, die Dinge umzuschreiben. Es ist nicht "einfach falsch". –