2009-11-06 91 views
15
使用WeakReference時,我們怎樣才能確定.IsAlive和.Target調用之間沒有收集目標?例如:

回答

25

剛剛獲得Target並檢查它是否不爲空:

object target = myWeakReference.Target; 
if (target != null) 
{   
    ((MyType)target).Foo(); 
} 

docs for IsAlive明確說:

由於對象可能是 回收垃圾收集 後立即 不建議 返回true,使用此屬性IsAlive屬性,除非你只爲一個假的返回值測試 。

2

你不能。將myWeakReference.Target分配給一個變量,並檢查是否爲空。

4

「IsAlive」屬性的唯一目的是當WeakReference的目標已經被銷燬時想要採取某些行動的情況下,但是您不希望冒着意外的風險將其存活超過必要的時間。如果有人說,例如

 
    if (someWeakReference.Target == null) 
    cleanup_related_object(); 

和垃圾收集是:(無論出於何種原因),其評估someWeakReference.Target代碼之後觸發時,GC會注意到存在着一個強引用該對象,並排除其收藏。在另一方面,他說:

 
    if (!someWeakReference.IsAlive) 
    cleanup_related_object(); 

不會有什麼意外延長someWeakReference目標的壽期目標

風險