91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

大关县| 时尚| 夹江县| 濉溪县| 海原县| 大宁县| 枣强县| 于田县| 兴宁市| 富阳市| 聂拉木县| 上蔡县| 屏东县| 含山县| 卢龙县| 怀化市| 琼结县| 博客| 泗洪县| 南汇区| 望江县| 高台县| 银川市| 镇远县| 义马市| 常熟市| 临海市| 大同市| 嘉峪关市| 博罗县| 鹰潭市| 肇州县| 旅游| 十堰市| 策勒县| 枝江市| 秦皇岛市| 江门市| 白河县| 沭阳县| 蕲春县|