Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 忽略垃圾收集的特定引用_C#_Garbage Collection - Fatal编程技术网

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类,您也可以从中派生。这很容易做到,尽管我不确定这是解决你问题的正确方法。