Kha*_*ash 15 .net c# weak-references
使用WeakReference时,我们怎样才能确定在.IsAlive和.Target调用之间没有收集目标?
例如:
if (myWeakReference.IsAlive)
{
// How can we be sure the object is still alive while here?
((MyType)myWeakReference.Target).Foo();
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 25
只需获取Target并检查它是否为空:
object target = myWeakReference.Target;
if (target != null)
{
((MyType)target).Foo();
}
Run Code Online (Sandbox Code Playgroud)
专门的文档IsAlive说:
因为在IsAlive属性返回true之后可能会立即回收对象以进行垃圾回收,所以除非您仅测试错误的返回值,否则不建议使用此属性.
“IsAlive”属性的唯一目的是用于以下情况:如果 WeakReference 的目标已被销毁,您希望采取一些操作,但又不想冒意外使其存活时间超过必要时间的风险。如果有人说,例如
if (someWeakReference.Target == null)
cleanup_相关_对象();
并且垃圾收集器(无论出于何种原因)在评估 someWeakReference.Target 的代码之后立即触发,GC 会注意到存在对该对象的强引用并阻止其收集。另一方面又说:
if (!someWeakReference.IsAlive)
cleanup_相关_对象();
不会有意外延长 someWeakReference 目标的目标生命周期的风险
| 归档时间: |
|
| 查看次数: |
1343 次 |
| 最近记录: |