类型对象会被垃圾回收吗?

Will the Type Object be garbage collected?

比如我有一个ClassA和一个方法f.

Class B
{
    void aMethod(){}    
}

void f()
{
    var a= new B();
    a.aMethod();
}

当执行一个方法时,CLR会首先在堆上初始化基本类型对象。因此,在 f 中的第一条语句执行之前,将在堆上分配并初始化一个对象 B Type Object

所以f执行完后,B Type Object会被垃圾回收吗?(B Type Object除了B实例,还有其他特殊的root吗?)

为澄清起见,B Type Object 指的是表示 B 类型

System.Type 对象

我正在阅读本书的第 4 章 CLR via C#

f() 方法完成后,在该方法中创建的 B 对象的实例变得 符合条件 可以收集。这并不一定意味着它会立即被收集。每当 GC 发生 运行 时,它就会被收集,这可能是也可能不是方法完成时。

但这听起来也像是您在谈论元数据,另一种用于描述对象类型的对象实例,例如 Type 类型。

因此我们需要讨论两件事:Type 实例和元数据。没有 Type 实例只是因为您第一次调用了 f() 方法并使用了 B 对象。每种类型都有 元数据,但它本身通常并不存在于堆上,当然也不仅仅是因为您第一次调用 f() 才分配的。相反,特定程序集的所有元数据都位于程序集目标代码中的 table 中。整个 table 都加载了程序集。您可以在这里阅读更多相关信息:

https://en.wikipedia.org/wiki/Metadata_(CLI)

这很令人困惑,因为还有一个 Object 类型,这在 .Net 中意味着完全不同的东西,并且在问题中使用 Object 这个词更让人困惑而不是帮助。但是 .Net 中的 Object 类型不会以任何特殊方式自动植根。当实例不再可用时,它们就会像其他任何东西一样有资格被收集。