委托变量不是垃圾收集

Tre*_*ent 1 .net c# delegates garbage-collection memory-management

最近发现ToGadget中的变量,也可能是委托,也没有收集垃圾.任何人都可以看到为什么.NET持有这个参考?似乎Foo结束后代表和所有代码都会被标记为垃圾收集.在倾倒堆之后,直接在内存中看到了B illions.

注意:'result.Things'是List <Gadget>(),Converter是系统委托.


        public Blah Foo()
        {
                var result = new Blah();
                result.Things = this.Things.ConvertAll((new Converter(ToGadget)));
                return result;
        }
        .................
        public static Gadget ToGadget(Widget w)
        {
            return new Gadget(w);
        }
Run Code Online (Sandbox Code Playgroud)

更新:将"ConvertAll"更改为此可清除代理和相应的对象引用.这告诉我,List <> ConvertAll以某种方式持有代表,或者我不明白这些东西是如何被垃圾收集的.


            foreach (var t in this.Things)
            {
                result.Things.Add(ToGadget(t));         
            }
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 6

使用内存分析器.

您可以整天询问StackOverflow并获得一些有根据的猜测,或者您可以在应用程序上打一个内存分析器,并立即看到根源和垃圾是什么.有专门为快速,轻松地解决您的确切问题而构建的工具.使用它们!

  • 难道他不是"倾倒堆"并查看具体实例,这表明他已经在进行某种形式的内存分析了吗?我更多地读了他的问题"为什么我的描述告诉我我有XXXX?这没有意义." (2认同)