Rom*_*ner 4 c# garbage-collection weak-references
大多数资源声明垃圾收集器根据引用自行计算出来并且我不应该弄乱它.
我想知道我是否可以明确地告诉垃圾收集器它可以在保持引用的同时处理对象.
我想要做的是告诉垃圾收集器我目前不再需要一个对象(但可能会再次)然后在以后(如果)我再次需要该对象时我想检查它是否有已被处置.如果它我只是重新创建它,如果它没有我想从垃圾收集"取消标记"它直到我再次完成它.
这可能吗?
我计划实现类似于Lazy<T>类的东西.伪代码:
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
Run Code Online (Sandbox Code Playgroud)
本WeakReference类不正是你想要什么,使用IsAlive性质使用它之前检查状态.
您可以通过该Target属性再次获得对其的"强烈"引用,这将影响引用计数并阻止其符合收集条件.
另请注意,Dispose这与垃圾收集没有直接关系,因此处理项目(取决于Dispose实现)可能会使其无法使用 - 但同样,这与GC无关.在一般的实践说明中,正如@HansPassant所提到的那样,调用Dispose一个项目(或者通常是任何声称要处置的东西),然后再尝试再次使用它是一种代码味道(或者只是错误的,因为其他开发人员希望Dispose是最后一个-call方法从那时起将对象标记为不可用).
该WeakReference班将不负责重新创建收集的对象,而是会同IsAlive你可以自己处理这个逻辑.
此外,就评论中的观点而言,GC WeakReference在决定何时收集它以试图将WeakReference项目留到最后时方面没有做任何巧妙的事情; 如果它符合条件,它将像运行中的其他对象一样收集底层对象 - 没有特殊处理,绝对没有"缓存"行为.
| 归档时间: |
|
| 查看次数: |
1853 次 |
| 最近记录: |