簡體   English   中英

靜態一次性物體

[英]Static disposable objects

  • 我該如何使用一次性物品管理static類? 有沒有經驗法則?

  • 基本上,我應該重構並使以下DisposableDataManagernon- 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是一個靜態類,在應用程序關閉之前可以訪問。

我相信你目前的工作方式可能有用,但肯定有更好的方法來解決你的計划打算做什么。 如果它確實有效,那就是濫用語言 - 使用功能來反對它們的目的。

如果繼續使用此體系結構路徑,則代碼將難以理解和修改。

用這種方法寫出你所追求的內容並提出其他想法可能是值得的。

無論如何,永遠不應該在靜態類中保存一次性資源。 因為如果程序結束它們不太可能被處理(例如程序崩潰的情況)。 因此,您可以在一個對象中自行添加和釋放資源,只要您的應用程序運行,該對象就會存在

  • 在進入程序循環之前,它被包裝在using語句中。
  • 或者你自己照顧它,並在程序結束后立即調用處理器。

或者您可以將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM