亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#實現(xiàn)IDisposable接口釋放非托管資源

 更新時間:2022年05月16日 10:25:06   作者:Laggage's  
這篇文章主要為大家介紹了C#實現(xiàn)IDisposable接口釋放非托管資源,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

Reference

Why using finalizers is a bad idea

當在一個類中使用了另外一個實現(xiàn)了IDisposable的類作為一個成員屬性時, 此時這個類就有必要也去實現(xiàn)IDisposable接口, 以確保在合適的實際釋放非托管資源, 到底該如何正確的實現(xiàn)這個接口呢? 當然這只是需要實現(xiàn)IDisposable接口其中一種情況

完整示例

示例的Foo類中包含了一個Stream類型的_stream成員, 因此需要為Foo類實現(xiàn)IDisposable模式

public class Foo : IDisposable
{
    private bool _disposed;
    private readonly Stream? _stream;
    public Foo()
    {
        _stream = File.Create("1.txt", 2048);
    }
    ~Foo()
    {
        CleanupUnmanagedResources();
    }
    private void CleanupUnmanagedResources()
    {
        if (_disposed) return;
        // 釋放非托管資源
        _stream?.Dispose();
        _disposed = true;
    }
    public void Dispose()
    {
        CleanupUnmanagedResources();
        GC.SuppressFinalize(this);
    }
}

為什么要實現(xiàn)Foo析構(gòu)函數(shù)

因為人性的弱點(??)

哈哈, 其實因為我們在使用Foo時可能會忘記手動調(diào)用其Dispose方法, 這個時候如果沒有析構(gòu)函數(shù)的話, 很可能導致資源永遠得不到釋放最終釀成內(nèi)存泄漏的慘劇.

當然啦, 在析構(gòu)函數(shù)中釋放非托管資源可能會給GC帶來額外的開銷, 所以最好的做法是依然是使用using塊保證能夠及時的調(diào)用Dispose方法, 這里使用析構(gòu)函數(shù)只是為了防止意外的發(fā)生. 至于為什么說在析構(gòu)函數(shù)中釋放非托管資源會導致額外的GC開銷呢, 這涉及到GC回收過程,GC在處理包含析構(gòu)函數(shù)的類時不會立即將此類回收, 而是會被GC標記為下一代, 這樣這個被標記為下一代的類只有在GC決定回收下一代的垃圾對象時, 才會被真正回收掉, 這樣一來就會導致額外的內(nèi)存和性能開銷了.

Dispose方法中為什么要調(diào)用GC.SuppressFinalize

GC.SuppressFinalize方法可以告訴GC不需要在調(diào)用此類的析構(gòu)函數(shù)(Finalizers)了;

因為在Foo類的析構(gòu)函數(shù)中調(diào)用了Foo.CleanupUnmanagedResources方法, 當GC回收此類調(diào)用此類析構(gòu)函數(shù)時, 有可能會導致兩次調(diào)用Foo.CleanupUnmanagedResources(第一次是Dispose方法中調(diào)用的)導致額外的開銷,

所以當我們手動調(diào)用了Foo.Dispose(通過是通過using語法糖)后, 就需要告訴GC, "你回收我的時候用不著調(diào)用我的析構(gòu)函數(shù)了, 該釋放的資源我早就釋放掉了已經(jīng)", 轉(zhuǎn)換成代碼就是GC.SuppressFinalize

以上就是C#實現(xiàn)IDisposable接口釋放非托管資源的詳細內(nèi)容,更多關(guān)于C# IDisposable接口釋放資源的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c#批量整理xml格式示例

    c#批量整理xml格式示例

    這篇文章主要介紹了c#批量整理xml格式示例,win7的x64和x86系統(tǒng)下已驗證通過,需要的朋友可以參考下
    2014-03-03
  • C#導入導出EXCEL文件的代碼實例

    C#導入導出EXCEL文件的代碼實例

    這篇文章主要介紹了C#導入導出EXCEL文件代碼實例,代碼的流程和方法都很詳細,需要的朋友可以參考下
    2014-04-04
  • C# 中使用 Exceptionless的方法

    C# 中使用 Exceptionless的方法

    這篇文章主要介紹了C# 中使用 Exceptionless的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-12-12
  • C#生成注冊碼的實例代碼

    C#生成注冊碼的實例代碼

    C#生成注冊碼的實例代碼,下面是一個小例子,需要的朋友可以參考一下
    2013-03-03
  • C#中IList<T>與List<T>的區(qū)別深入解析

    C#中IList<T>與List<T>的區(qū)別深入解析

    本篇文章主要是對C#中IList<T>與List<T>的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#窗口實現(xiàn)單例模式的方法

    C#窗口實現(xiàn)單例模式的方法

    本文介紹了C#窗口實現(xiàn)單例模式的方法,對于一個軟件如果第二次打開程序,就把已經(jīng)啟動的那個進程的窗口放到最前端顯示,需要了解的朋友可以參考下
    2015-07-07
  • C#預(yù)處理指令之#line,#pragma warning 詳細解析

    C#預(yù)處理指令之#line,#pragma warning 詳細解析

    #line 指令可能由生成過程中的自動中間步驟使用。例如,如果行從原始的源代碼文件中移除,但是您仍希望編譯器基于文件中的原始行號生成輸出,則可以移除行,然后用 #line 模擬原始行號
    2014-01-01
  • C#生成指定范圍內(nèi)的不重復隨機數(shù)

    C#生成指定范圍內(nèi)的不重復隨機數(shù)

    對于隨機數(shù),大家都知道,計算機不 可能產(chǎn)生完全隨機的數(shù)字,所謂的隨機數(shù)發(fā)生器都是通過一定的算法對事先選定的隨機種子做復雜的運算,用產(chǎn)生的結(jié)果來近似的模擬完全隨機數(shù),這種隨機數(shù)被稱 作偽隨機數(shù)。偽隨機數(shù)是以相同的概率從一組有限的數(shù)字中選取的。
    2015-05-05
  • 詳解C# 代碼占用的空間

    詳解C# 代碼占用的空間

    這篇文章主要介紹了C# 代碼占用的空間的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-02-02
  • C# 表達式目錄樹的應(yīng)用詳解

    C# 表達式目錄樹的應(yīng)用詳解

    下面小編就為大家分享一篇C# 表達式目錄樹的應(yīng)用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12

最新評論