Membersihkan sumber daya yang tidak terkelola

Untuk sebagian besar objek yang dibuat aplikasi, Anda dapat mengandalkan pengumpul sampah .NET untuk menangani manajemen memori. Namun, ketika Anda membuat objek yang menyertakan sumber daya yang tidak dikelola, Anda harus secara eksplisit merilis sumber daya tersebut ketika Anda selesai menggunakannya. Jenis sumber daya yang paling umum adalah objek yang membungkus sumber daya sistem operasi, seperti file, jendela, koneksi jaringan, atau koneksi database. Meskipun pengumpul sampah dapat melacak masa pakai objek yang merangkum sumber daya yang tidak dikelola, ia tidak tahu cara melepaskan dan membersihkan sumber daya yang tidak dikelola.

Jika jenis Anda menggunakan sumber daya yang tidak dikelola, Anda harus melakukan hal berikut:

  • Menerapkan pola pembuangan. Hal ini mengharuskan Anda menyediakan implementasi IDisposable.Dispose untuk mengaktifkan rilis deterministik sumber daya yang tidak dikelola. Konsumen jenis Anda memanggil Dispose ketika objek (dan sumber daya yang digunakannya) tidak lagi diperlukan. Metode Dispose ini segera merilis sumber daya yang tidak dikelola.

  • Jika konsumen jenis Anda lupa untuk memanggil Dispose, berikan cara agar sumber daya Anda yang tidak dikelola dirilis. Ada dua cara untuk melakukannya:

    • Gunakan handel yang aman untuk membungkus sumber daya Anda yang tidak dikelola. Hal ini adalah teknik yang direkomendasikan. Hndel aman berasal dari kelas abstrak System.Runtime.InteropServices.SafeHandle dan menyertakan metode Finalize yang kuat. Ketika Anda menggunakan handel yang aman, Anda cukup mengimplementasikan antarmuka IDisposable dan memanggil metode Dispose handel aman Anda dalam implementasi IDisposable.Dispose Anda. Finalizer handel aman dipanggil secara otomatis oleh pengumpul sampah jika metode Disposenya tidak dipanggil.

      atau

    • Tentukan penyelesai. Finalisasi memungkinkan rilis sumber daya yang tidak terkelola secara non-deterministik ketika konsumen jenis gagal memanggil IDisposable.Dispose untuk membuangnya secara deterministik.

      Peringatan

      Finalisasi objek dapat menjadi operasi yang kompleks dan rawan kesalahan, kami sarankan Anda menggunakan handel yang aman alih-alih menyediakan finalizer Anda sendiri.

Konsumen jenis Anda kemudian dapat memanggil implementasi IDisposable.Dispose Anda langsung ke memori bebas yang digunakan oleh sumber daya yang tidak dikelola. Ketika Anda menerapkan metode Dispose dengan benar, baik metode Finalize handel aman Anda atau penimpaan metode Object.Finalize Anda sendiri menjadi perlindungan untuk membersihkan sumber daya jika metode Dispose tidak dipanggil.

Di bagian ini

Menerapkan metode Buang menjelaskan cara menerapkan pola pembuangan untuk merilis sumber daya yang tidak dikelola.

Menggunakan objek yang mengimplementasikan IDisposable menjelaskan bagaimana konsumen jenis memastikan bahwa implementasi Disposenya dipanggil. Kami sangat menyarankan menggunakan pernyataan C# using (atau Visual Basic Using) untuk melakukan ini.

Referensi

Jenis / Anggota Deskripsi
System.IDisposable Menentukan metode Dispose untuk merilis sumber daya yang tidak dikelola.
Object.Finalize Menyediakan finalisasi objek jika sumber daya yang tidak dikelola tidak dirilis oleh metode Dispose.
GC.SuppressFinalize Menekan finalisasi. Metode ini biasanya dipanggil dari metode Dispose untuk mencegah finalizer dieksekusi.