0

例如,我有一个 A 类和一个方法 f。

Class B
{
    void aMethod(){}    
}

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

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

那么在 f 执行之后,会B Type Object被垃圾回收吗?(除了InstanceB Type Object有什么特别的吗?)rootB

为了清楚起见,B Type Object指的System.Type是表示B类型的对象

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

4

1 回答 1

1

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

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

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

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

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

于 2019-08-23T03:54:00.933 回答