c# - 垃圾收集和作用域在 C# 中是如何工作的?

标签 c# .net python garbage-collection

我正在学习 C# coming from python并希望知道 C# 垃圾收集器是如何工作的 - 我发现一旦我弄清楚它在幕后做了什么,我对 python 的了解就更多了,并且希望避免在学习 python 时犯我一开始犯的那种菜鸟错误.

我无法找到任何明确的解释来说明何时某个项目会被垃圾回收并留下诸如

之类的问题
  1. “当一个对象的最后一个引用超出范围时会发生什么?”该对象是否会被垃圾回收,或者当您传回定义它的范围时它是否仍然存在?
  2. “引用数量在什么时候减少?”让我想知道它是否甚至使用引用计数或其他一些技术......

对这些问题的回答,或者更好的是对实际发生的事情进行清晰简洁的概述将赢得 cookie(或赞成票),如果您的回答将其与 python 的做事方式进行比较,那就更好了。我对哪个更好不感兴趣,只是细节。还回答了我在 programmers.stackexchange 上的原始帖子将不胜感激...

最佳答案

dotnet GC 引擎是一个标记和清除引擎,而不是您在 python 中习惯的引用计数器引擎。系统不维护对变量的引用计数,而是在需要回收 RAM 时运行“集合”,标记所有当前可访问的指针,并删除所有不可访问的指针(因此超出范围)。

您可以在此处了解有关其工作原理的更多信息:
http://msdn.microsoft.com/en-us/library/ee787088.aspx

系统通过从特定的“根”位置开始查找“可达”对象,例如全局对象和堆栈上的对象,并跟踪这些对象引用的所有对象,以及这些对象引用的所有对象等,直到构建完成一棵完整的树。这比听起来要快。

关于c# - 垃圾收集和作用域在 C# 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5422918/

相关文章:

c# - 将委托(delegate)序列的复杂交互链接在一起

c# - 部署 .NET 应用程序时出现 InvalidDeploymentException 错误

C# 程序关闭

c# - MVC 中具有相同签名的方法

.net - Delegate.EndInvoke() 真的有必要吗?

Python Beautifulsoup img标签解析

python - 尝试在 Windows 上 pip 安装包时访问被拒绝

python - yacc 无法归约 (Python Lex-Yacc)

C# - 使用单个键从文本文件中获取多个值

c# - 有没有办法计算忽略初始化时间的测试方法的运行时间?