Ada*_*son 13
实现您正在寻找的东西的唯一方法是在类本身中保留这些对象的静态列表.如果你只是想看看某个地方是否有一个没有被垃圾收集的实例,那么你就会想要使用这个WeakReference类.例如...
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;
}
}
Run Code Online (Sandbox Code Playgroud)
由于您是OO/.NET的新手,不要让WeakReference使用吓到你.垃圾收集的工作方式是引用计数.只要某段代码或对象可以访问特定实例(意味着它在作为本地,实例或静态变量的一部分或作为本地,实例或静态变量的一部分),则该对象被认为是活动的.一旦该变量超出范围,在此之后的某个时刻,垃圾收集器可以/将收集它.但是,如果要维护所有引用的列表,它们将永远不会超出范围,因为它们将作为该列表中的引用存在.这WeakReference是一个特殊的类,允许您维护对垃圾收集器将忽略的对象的引用.该IsAlive属性指示是否WeakReference指向仍存在的有效对象.
所以我们在这里做的是保持这个WeakReferences的列表指向MyClass已经创建的每个实例.当你想获得它们的列表时,我们遍历我们的WeakReferences并抢夺所有活着的.我们发现不再存在的任何东西被放入另一个临时列表中,以便我们可以从外部列表中删除它们(这样WeakReference就可以收集类本身,并且我们的列表不会无缘无故地变大).