【发布时间】:2019-08-23 02:14:25
【问题描述】:
例如,我有一个 A 类和一个方法 f。
Class B
{
void aMethod(){}
}
void f()
{
var a= new B();
a.aMethod();
}
当执行一个方法时,CLR 将首先在堆上启动基本类型对象。因此,在 f 执行的第一条语句之前,将在堆上分配并初始化对象 B Type Object。
那么在 f 被执行之后,B Type Object 会被垃圾回收吗?(除了B 实例之外,B Type Object 是否还有一些特殊的root?)
为了澄清,B Type Object 指的是代表B 类型的System.Type 对象
我正在阅读本书CLR via C# 的第 4 章。
【问题讨论】:
-
“类型对象”是什么意思?你说的是
B存储在a中的实例,还是说代表B类型的System.Type对象? -
“那么在执行 f 之后,B 类对象会被垃圾回收吗?” - 简短回答 是 但不会立即。 何时取决于 CLR 并且是一个复杂的主题
-
@AlexWei 我不知道确切的答案,但我怀疑
System.Type对象永远不会被垃圾收集。无论如何,它们都很轻巧。 -
Related question(如果我理解你的意思,那就是)。
-
要记住的是,CLR 不必遵循与您相同的规则。元数据的处理方式与常规对象实例不同。
标签: c# garbage-collection clr