c# - 委托(delegate)变量未被垃圾收集

标签 c# .net memory-management delegates garbage-collection

最近发现 ToGadget 中的变量,可能还有委托(delegate),没有被垃圾收集。谁能看出为什么 .NET 持有对此的引用?似乎在 Foo 结束后,委托(delegate)和所有对象都将被标记为垃圾收集。转储堆后,确实在内存中看到了数十亿

注意:'result.Things' 是一个 List () 并且 Converter 是一个系统委托(delegate)。


        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);
        }

更新:将“ConvertAll”更改为此会清理委托(delegate)和相应的对象引用。这向我表明,要么 List<> ConvertAll 以某种方式保留委托(delegate),要么我不明白这些东西是如何被垃圾收集的。


            foreach (var t in this.Things)
            {
                result.Things.Add(ToGadget(t));         
            }

最佳答案

使用内存分析器。

您可以整天在 StackOverflow 上提问并得到一堆有根据的猜测,或者您可以在您的应用程序上使用内存分析器并立即查看哪些是 root 的,哪些是垃圾。有一些可用的工具专门用于快速轻松地解决您的确切问题。使用它们!

关于c# - 委托(delegate)变量未被垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2106000/

相关文章:

algorithm - 迭代具有 O(1) 辅助空间的二叉树

c# - 动词 = "runas"未以提升的方式运行

c# - MVC RedirectToAction 在 JSON 后返回后不起作用

c# - 如何使用 Web Proxy 绕过网络?

c# - TryCatch 与 TryParse 的优缺点

.net - Visual Studio 不加载项目引用

.net - F# 4.0.0.0 到 4.3.0.0 的系统范围 bindingRedirect

c# - 您可以/如何在运行时为 PropertyGrid(对于 PCL)指定编辑器?

Java 100个左右的并行线程,内存管理

c - uint8_t 数组中整数(或其他)类型的字节对齐