C# 忽略垃圾收集的特定引用
假设我有这个:C# 忽略垃圾收集的特定引用,c#,garbage-collection,C#,Garbage Collection,假设我有这个: public static class FooKeeper { public static List<Foo> foos = new List<Foo>(); } public class Foo { public Foo() { FooKeeper.foos.Add(this); } } 我希望这样做,当类型为Foo的对象被垃圾收集时,我将手动将其从FooKeeper类的列表中删除。当然,这是没有意义
public static class FooKeeper
{
public static List<Foo> foos = new List<Foo>();
}
public class Foo
{
public Foo()
{
FooKeeper.foos.Add(this);
}
}
我希望这样做,当类型为Foo的对象被垃圾收集时,我将手动将其从FooKeeper类的列表中删除。当然,这是没有意义的,因为Foo对象不能被垃圾收集,因为FooKeeper总是有一个对它们的引用
有没有办法告诉GC忽略FooKeeper中列表中的引用?或者其他一些方法来解决这个问题?用它来实现你想要的
public static List<WeakReference<Foo>> foos = new List<WeakReference<Foo>>();
你想干什么?为什么您要试图干扰垃圾收集周期——您的类似乎没有任何理由这样做。只要引用了一个实例,GC就会将其保留。如果它没有被引用,你通常不需要做任何事情-GC会在它运行时接收它。我正在尝试为Unity3d创建一个计时器类,如果你愿意,我可以向你展示完整的代码,但是你需要知道unity是如何工作的,我认为这与此无关。你误解了我的问题。你有一个对象的pulic静态列表-这些对象是什么并不重要,因为它们属于该列表。如果列表不是这些对象的所有者,也许您应该重新考虑如何存储它们。根据你的问题和评论,这听起来像是一个X/Y问题——这就是为什么我问你要解决的问题是什么。我想我做不到。如果我输入WeakReference测试;编译器说非泛型类型不能与类型参数一起使用;在添加到列表中时,我尝试了以下方法:FooKeeper.foos.Addnew WeakReferencethis.Target as Foo,但是对象没有被收集。你应该将你的.Net框架更新到4.5版本。哦,这就是问题所在。我使用的是Unity,它不支持.NET4.5=/@FelipeMüller,应该有一个非泛型的WeakReference类,您也可以从中派生。这很容易做到,尽管我不确定这是解决你问题的正确方法。