[英]Garbage Collection best practice in .net
System.GC.Collect
和Dispose()
什么區別?
它們不是用於同一目的,何時應該使用它們; 什么是最佳做法?
最佳做法是永遠不需要調用GC.Collect
,並在完成所有IDisposable
對象時調用Dispose
。
GC.Collect的目的是告訴垃圾收集器內存中有一些可以收集的對象,這是收集的正確時間。 雖然,根據經驗,你應該把它留給GC本身。 它旨在完成這項工作。
如果您的對象中有一些資源,您認為GC不會處理。 您應該實現Dispose並自己處理它們 。 您需要顯式調用Dispose來處置所需的資源。 如果您正在實現IDisposable,那么您也可以通過Using語句來實現。
當垃圾收集器收集內存中的所有對象時,將調用System.GC.Collect 。 在托管代碼中引用的對象不考慮用於垃圾收集。 此方法用於強制系統回收可用內存。
Dispose()不是GC的一部分,但作為更好的練習,您可以使用它。 它應該只用於使用非托管資源(如FileStream等)的對象。它應該釋放它擁有的所有資源。 當您知道GC不會釋放某些資源時,您可以使用Dispose()方法。
using語句確保正確使用IDisposable對象。
旁注: GC不調用Dispose,它調用終結器(你應該從Dispose調用它(false))
此外,為了確保始終正確地釋放資源,Dispose方法應該可以多次調用,而不會拋出異常。
MSDN說:
“可以通過調用Collect來強制進行垃圾收集,但大部分時間都應該避免這種情況,因為它可能會產生性能問題。”
查看此博客 : -
GC.Collect()要求系統“立即”執行集合。 你不應該搞砸這個; 系統通常比你需要收集時有更好的想法。
最好的做法是:
您可以使用using塊或如您所述使用Dispose方法。
為什么要使用IDisposable和Dispose?
MSDN說
在許多情況下,通過實現IDisposable接口,可能總是需要最終確定的對象可以避免這種成本。 這個接口提供了一種替代方法來回收資源,這些資源的生命周期是程序員所熟知的,並且實際上發生了很多。 當然,如果你的對象只使用內存而不需要最終確定或處理,那么它會更好; 但如果需要最終確定並且很多情況下對對象的顯式管理很容易且實用,那么實現IDisposable接口是避免或至少降低最終化成本的好方法。
另請參閱本文關於使用finalize / dispose模式改善垃圾收集器性能
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.