2012-08-15 37 views
3

在.Net 2.0中工作,將代碼基地快速移動到4.0將代理傳遞給靜態類會導致泄漏嗎?

最近,我一直在使用事件序列化類,字段:NonSerializable]現在停止這個)。

這讓我想到,如果我將委託傳遞給靜態類的方法(僅用於方法作用域),那麼靜態類是否將委託的所有者作爲根,導致它由GC無法收集?

我有一個靜態的ListUtilities類做lambda表達式的工作,以及靜態緩存,我經常通過委託,並想知道這是否會泄漏內存?

+0

鑑於LINQ建立在擴展方法的基礎之上,它是靜態方法的語法糖,如果使用LINQ的話,你認爲這對任何人來說都不是一個大規模的問題嗎? – 2012-08-15 06:49:59

回答

5

不,不用擔心。將委託傳遞給方法沒有問題,(除非該方法無限期地將委託存儲在某個地方)。

什麼問題,雖然是靜態事件(或長壽命對象上的事件,如單身人士)。如果您不取消訂閱這些內容,那麼該事件可以讓對象永遠存在。例如:

// this object is meant to be short-lived 
var obj = new SomeType(); 

// some static event 
MyUtility.SomeEvent += { obj.Foo(); }; 

現在MyUtility靜態情況下防止新SomeType例如,從收集,直到該事件訂閱被刪除......它可能永遠不會是,因爲它是一個匿名方法(這需要巫術退訂)。

+0

感謝Marc,進一步思考,我猜想,一旦包含委託的堆棧框架彈出堆棧,就無法將調用對象根植到靜態對象上。無論如何,感謝您的確認。有一個upvote和一個勾號。 – johnc 2012-08-15 07:23:35

+0

@johnc事實上,在大多數情況下,它是* stack *,它有參考,它是暫態的。只有當引用被放到某個以前沒有收集過的東西時(如:靜態/單例事件),它纔會成爲問題。 – 2012-08-15 07:25:11

3

這不會導致內存泄漏。只要您不將委託參考保存在靜態變量中,那麼在方法結束後,可以收集委託所有者。

相關問題