最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

Reference

Why using finalizers is a bad idea

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

完整示例

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

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

因?yàn)槿诵缘娜觞c(diǎn)(??)

哈哈, 其實(shí)因?yàn)槲覀冊(cè)谑褂?code>Foo時(shí)可能會(huì)忘記手動(dòng)調(diào)用其Dispose方法, 這個(gè)時(shí)候如果沒有析構(gòu)函數(shù)的話, 很可能導(dǎo)致資源永遠(yuǎn)得不到釋放最終釀成內(nèi)存泄漏的慘劇.

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

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

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

因?yàn)樵?code>Foo類的析構(gòu)函數(shù)中調(diào)用了Foo.CleanupUnmanagedResources方法, 當(dāng)GC回收此類調(diào)用此類析構(gòu)函數(shù)時(shí), 有可能會(huì)導(dǎo)致兩次調(diào)用Foo.CleanupUnmanagedResources(第一次是Dispose方法中調(diào)用的)導(dǎo)致額外的開銷,

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

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

相關(guān)文章

最新評(píng)論

宁津县| 贞丰县| 灵武市| 商水县| 常德市| 丰宁| 桑植县| 新野县| 炎陵县| 邵武市| 黑龙江省| 全南县| 白城市| 福海县| 于田县| 时尚| 保亭| 台湾省| 东平县| 岑巩县| 开化县| 石狮市| 南昌市| 台北市| 怀远县| 余姚市| 观塘区| 泾川县| 包头市| 宁德市| 温泉县| 蕲春县| 绥化市| 历史| 北安市| 治县。| 威信县| 涟源市| 武汉市| 白沙| 苏尼特右旗|