我知道,当实例化该类的新实例并且没有对该实例的引用时,该实例的析构函数就已执行,该实例的实例变量就可以使用。但是,实例变量在结构中的生存期如何?
谢谢。
最佳答案
当没有对该实例的引用时,该实例的析构函数已执行
仅当该类具有析构函数时(否则,才简单地回收其内存),未在该对象上调用GC.SuppressFinalize
以及垃圾回收器决定收集该对象所属的世代时。
另请注意,销毁对象与回收其内存不同。
当GC调用对象的析构函数时,该对象将被提升到下一代,并且如果仍然没有强引用,则只有在下一次GC决定收集该世代时,才会回收该对象的内存。
这就是为什么可以通过在析构函数内创建对自身的强大引用(例如,将自身分配给静态字段)来复活对象的原因(但不要这样做!)。
但是,实例变量在结构中的生存期如何?
如果在方法中声明了它们并且未在任何地方泄漏(例如在闭包中使用它或将其分配给字段成员),则有可能将它们放到堆栈上,并在方法结束时确定性地删除它们,并且GC永远不会知道。
如果将他们分配到某个领域,则他们的生存时间与封闭类的生存时间相同。
同样,结构不能有析构函数。