中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#怎么實現IDisposable接口釋放非托管資源

發布時間:2022-05-16 13:40:32 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

這篇文章主要介紹了C#怎么實現IDisposable接口釋放非托管資源的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C#怎么實現IDisposable接口釋放非托管資源文章都會有所收獲,下面我們一起來看看吧。

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

完整示例

示例的Foo類中包含了一個Stream類型的_stream成員, 因此需要為Foo類實現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);
    }
}

為什么要實現Foo析構函數

因為人性的弱點(????)

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

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

Dispose方法中為什么要調用GC.SuppressFinalize

GC.SuppressFinalize方法可以告訴GC不需要在調用此類的析構函數(Finalizers)了;

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

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

關于“C#怎么實現IDisposable接口釋放非托管資源”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C#怎么實現IDisposable接口釋放非托管資源”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

神农架林区| 札达县| 淳安县| 疏勒县| 鸡泽县| 彭阳县| 福贡县| 长泰县| 榕江县| 尚义县| 长沙县| 泸定县| 闽侯县| 宜城市| 涟水县| 贺兰县| 徐汇区| 彝良县| 永靖县| 蒲城县| 胶州市| 湖州市| 闸北区| 嘉荫县| 长治市| 禄劝| 台北县| 兴义市| 通海县| 淅川县| 浙江省| 阿巴嘎旗| 德钦县| 高安市| 外汇| 洪江市| 沁源县| 汝州市| 略阳县| 曲周县| 陵川县|