如何以安全的方式获得弱参考的目标

meh*_*dvd 8 .net c# garbage-collection weak-references

考虑以下代码:

var weakRef = new WeakReference(new StringBuilder("Mehran"));
if (weakRef.IsAlive)
{
    // Garbage Collection might happen.
    Console.WriteLine((weakRef.Target as StringBuilder).ToString());
}
Run Code Online (Sandbox Code Playgroud)

这是可能的GC.Collect,以检查后运行weakRef.IsAlive,并使用之前weakRef.Target.

我错了吗?如果可能的话,有一个安全的方法吗?

例如,类似的API weakRef.GetTargetIfIsAlive()是合适的.

Mic*_*Liu 12

那个API已经存在; weakRef.Target返回null如果对象已经被垃圾收集.

StringBuilder sb = weakRef.Target as StringBuilder;
if (sb != null)
{
    Console.WriteLine(sb.ToString());
}
Run Code Online (Sandbox Code Playgroud)


sup*_*cat 9

IsAlive属性不存在是为了代码的好处,如果它是活着的,那么它将希望使用目标,而是为了代码的好处,该代码想要找出目标是否已经死亡但是没有兴趣在任何目标中访问它案件.如果代码要Target针对null 进行测试,那么这将导致Target暂时具有强根源引用(针对null进行测试的代码),并且生成这样的有根引用的行为可能会阻止对象在其被垃圾收集时否则会.如果代码不感兴趣,Target除了找出它是否已经失效,代码没有理由得到引用.它可以简单地测试IsAlive,并在它返回时采取适当的行动false.