gpt4 book ai didi

c# - 数组何时需要进行垃圾收集?

转载 作者:行者123 更新时间:2023-11-30 19:01:04 27 4
gpt4 key购买 nike

几年前我通过 C# 阅读了 CLR 这本书,前几天我被问到是否有一个数组并且仍然有点困惑,问题是弄清楚下面方法中的数组何时可用于垃圾收集:

public static double ThingRatio()
{
var input = new [] { 1, 1, 2 ,3, 5 ,8 };
var count = input.Length;
// Let's suppose that the line below is the last use of the array input
var thingCount = CountThings(input);
input = null;
return (double)thingCount / count;
}

根据此处给出的答案:When is an object subject to garbage collection?其中指出:

They will both become eligible for collection as soon as they are not needed anymore. This means that under some circumstances, objects can be collected even before the end of the scope in which they were defined. On the other hand, the actual collection might also happen much later.

我倾向于说从第 6 行开始(即 input = null;),数组会受到 GC 但我不太确定...(我的意思是数组应该肯定是在赋值后不再需要,但也在 CountThings 调用之后苦苦挣扎,但同时“需要”数组进行空赋值。

最佳答案

记住对象和变量不是一回事。 变量 具有特定方法或类型的作用域,但它引用或用来引用的对象没有这样的概念;这只是一团内存。如果 GC 在 input = null; 之后但在方法结束之前运行,则数组只是一个孤立对象。它可达,因此符合收集条件。

“可达”(而不是“需要”)是这里的关键词。此行之后不再需要数组对象:var thingCount = CountThings(input);。但是,它仍然可以访问,因此无法在此时收集...

我们还需要记住它不是立即收集的。只有有资格被收集。实际上,我发现 .Net 运行时并不倾向于在用户方法中间调用 GC,除非它真的必须这样做。 一般来说,过早将变量设置为 null 没有必要也没有帮助,在极少数情况下甚至可能有害。

最后,我要补充一点,我们读取和写入的代码与机器实际使用的代码并不相同。请记住,还有一个编译步骤将所有这些翻译成 IL,然后是一个 JIT 过程来创建真正运行的最终机器代码。甚至下一行之后的概念也已经是对实际发生的事情的抽象。一行可能会扩展为几行实际的 IL,或者在某些情况下甚至会被重写以涉及所有新的编译器生成的类型,如闭包或迭代器 block 。所以这里的一切实际上只是指简单的情况。

关于c# - 数组何时需要进行垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53211655/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com