[英]Static disposable objects
我該如何使用一次性物品管理static
類? 有沒有經驗法則?
基本上,我應該重構並使以下DisposableDataManager
類non- static
或將所有內容留給GC
嗎?
。
public static class DisposableDataManager
{
// ImageList is an 'IDisposable'.
public static ImageList FirstImageList { get; private set; }
public static ImageList SecondImageList { get; private set; }
static DisposableDataManager()
{
FirstImageList = CreateFirstImageList();
SecondImageList = CreateSecondImageList();
}
// ...
}
這實際上取決於資源處置對您的重要性。 當您的應用程序關閉時,它打開的所有句柄(文件,網絡連接,圖形等)都將被釋放,所以這不是問題。 如果你想要一個更有序的發布處理,那就更成問題了 - 例如在關閉它之前沖洗流。 在進程退出之前,CLR會盡最大努力運行終結器,在某些情況下會調用Dispose
- 但這並不是我想要依賴的重要事項。
因此,對於ImageList
對象,它確實應該不是問題。 你絕對不會泄漏任何資源 - 操作系統將負責這一點。
話雖如此,我仍然試圖重構 - 僅僅因為全球狀態往往是一個壞主意。 它使隱含的依賴性和測試更加困難。 在施工時向每個需要它的物體提供相關信息有多難?
(注意:靜態變量實際上與AppDomain
相關聯,而不是整個過程。這使得整個問題在AppDomain
啟動和關閉的應用程序中更加復雜,但我懷疑它與您的場景相關。)
作為靜態類,您說應用程序可以使用所有內容。 那你為什么要把它丟棄呢?
您可以掛鈎AppDomain.DomainUnload事件,並在退出之前調用要確保清除的任何內容上的dispose。
我從該代碼中看到的是,您將無法處置ImageList
因為DisposableDataManager
是一個靜態類,在應用程序關閉之前可以訪問。
我相信你目前的工作方式可能有用,但肯定有更好的方法來解決你的計划打算做什么。 如果它確實有效,那就是濫用語言 - 使用功能來反對它們的目的。
如果繼續使用此體系結構路徑,則代碼將難以理解和修改。
用這種方法寫出你所追求的內容並提出其他想法可能是值得的。
無論如何,永遠不應該在靜態類中保存一次性資源。 因為如果程序結束它們不太可能被處理(例如程序崩潰的情況)。 因此,您可以在一個對象中自行添加和釋放資源,只要您的應用程序運行,該對象就會存在
或者您可以將ImageList更改為根本不可丟棄。 只有當您可以自行處理它擁有的所有資源時,這才是一個選項。
我認為你不需要做任何一次性對象管理器。 GC已經為您管理內存。 您可能已經知道,Dispose方法是來自IDisposable接口的一個包含在.Net框架中的方法。 但這是一種像其他人一樣的方法*。 垃圾收集器不等待調用Dispose來釋放對象的內存。 他監視對象是否總是可以從某個地方到達。 這有助於他確定哪些物體存活,哪些物體死亡。
之前繼續閱讀有關GC生成的內容。 http://msdn.microsoft.com/en-us/library/ms973837.aspx
我不確定,但是當調用new()並且GC達到實際使用的代的容量時,他清除下一代“死”對象。 可能在其他時候,我沒有。 GC是一個神秘而神秘的實現,因為它可能在C ++中死記硬背。 但你不必關心它。
在某些情況下(單聲道開發),我聽說你應該更關心它。 但如果您在Microsoft環境中進行編碼則不行。
*我告訴:
像任何其他人一樣的方法
但是使用塊讓你可以自由地調用IDisposable對象的Dispose方法並為你調用方法。 Dispose方法的現有方法是釋放在停止使用對象之前需要釋放的資源。
例如:
public class Test : IDisposable
{
public void Dispose()
{
// release other necessary ressources if needed
Console.WriteLine("Disposed");
}
}
{
using (IDisposable disposable = new Test())
{
}
}
如同:
{
IDisposable disposable = new Test()
disposable.Dispose();
}
所以你可以對GC充滿信心。 如果你想確保GC將釋放你的對象內存,只需將它的所有引用都置為null。 GC會將您的對象視為“死亡”:P
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.