gpt4 book ai didi

c# - 是否可以手动标记/取消标记对象以进行垃圾收集?

转载 作者:太空狗 更新时间:2023-10-30 00:24:55 24 4
gpt4 key购买 nike

大多数资源都指出垃圾收集器会根据引用自行计算出来,我不应该乱搞它。

我想知道我是否可以明确地告诉垃圾收集器它可能处理一个对象同时仍然保留一个引用。

我想做的是告诉垃圾收集器我目前不再需要某个对象(但可能会再次需要),然后在稍后(如果)我再次需要该对象时我想检查一下如果它已经被处置。如果它有,我只是重新创建它,如果没有,我想从垃圾收集中“取消标记”它,直到我再次完成它。

这可能吗?

我计划实现类似于 Lazy<T> 的东西类(class)。伪代码:

obj = new DisposeIfNecessary<LargeObject>(() => InitLargeObject());
obj.DoSomething(); // Initializes obj using InitLargeObject()
obj.DisposeIfNecessary(); // This is where the magic happens

... // obj might get disposed at some point

obj.DoAnotherThing(); // Might or might not call InitLargeObject() again
obj.Dispose(); // I will not need it again

最佳答案

WeakReference类完全符合您的要求,使用 IsAlive 属性在使用前检查状态。

您可以通过 Target 属性再次获得对它的“强”引用,这将影响引用计数并阻止它符合收集条件。

另请注意,Dispose 与垃圾回收没有直接关系,因此处置一个项目(取决于 Dispose 实现)可能会使其无法使用 - 但同样,这与GC无关。在一般实践中,正如@HansPassant 所提到的,调用 Dispose 一个项目(或通常任何声称要处理的东西)然后尝试再次使用它是一种代码味道(或者完全错误,因为其他开发人员会期望 Dispose 成为最后一次调用方法,将对象标记为从那时起不可用)。

WeakReference 类不负责重新创建收集的对象,但与 IsAlive 结合使用时,您可以自己处理该逻辑。

此外,就评论中的观点而言,GC 并没有对 WeakReference 做任何聪明的事情来决定何时收集它,试图离开 WeakReference 项目直到最后;如果符合条件,它将收集底层对象,就像在运行期间收集其他对象一样——没有特殊处理,绝对没有“缓存”行为。

关于c# - 是否可以手动标记/取消标记对象以进行垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20654578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com