Apa yang dimaksud dengan istilah sumber daya terkelola dan sumber daya tak terkelola di .NET? Bagaimana mereka muncul?
Apa yang dimaksud dengan istilah sumber daya terkelola dan sumber daya tak terkelola di .NET? Bagaimana mereka muncul?
Jawaban:
Istilah "sumber daya tidak terkelola" biasanya digunakan untuk mendeskripsikan sesuatu yang tidak secara langsung berada di bawah kendali pengumpul sampah . Misalnya, jika Anda membuka koneksi ke server database, ini akan menggunakan sumber daya di server (untuk memelihara koneksi) dan mungkin sumber daya non-.net lainnya di mesin klien, jika penyedia tidak ditulis seluruhnya dalam kode yang dikelola.
Inilah sebabnya, untuk sesuatu seperti koneksi database, Anda disarankan untuk menulis kode Anda seperti ini:
using (var connection = new SqlConnection("connection_string_here"))
{
// Code to use connection here
}
Karena ini memastikan yang .Dispose()
dipanggil pada objek koneksi, memastikan bahwa sumber daya yang tidak dikelola dibersihkan.
Dalam Tanya Jawab Apa itu sumber daya yang tidak terkelola? 1 , Bruce Wood memposting yang berikut ini:
Saya memikirkan istilah "terkelola" dan "tidak terkelola" seperti ini:
"Terkelola" mengacu pada apa pun di dalam kotak pasir .NET. Ini mencakup semua kelas .NET Framework.
"Tidak dikelola" mengacu ke hutan belantara di luar kotak pasir .NET. Ini termasuk apa pun yang dikembalikan kepada Anda melalui panggilan ke fungsi Win32 API.
Jika Anda tidak pernah memanggil fungsi Win32 API dan tidak pernah mendapatkan kembali objek "menangani" Win32, maka Anda tidak memegang sumber daya yang tidak terkelola. File dan aliran yang Anda buka melalui metode kelas .NET Framework semuanya adalah pembungkus terkelola.
Komentar: Anda tidak boleh memegang sumber daya yang tidak dikelola secara langsung . Namun, Anda mungkin memegang sumber daya yang tidak dikelola secara tidak langsung melalui "kelas pembungkus" yang dikelola seperti System.IO.FileStream . Kelas pembungkus seperti itu biasanya mengimplementasikan IDisposable (baik secara langsung atau melalui pewarisan).
... banyak objek terkelola (.NET Framework) menyimpan sumber daya yang tidak terkelola di dalamnya, dan Anda mungkin ingin membuangnya () secepat mungkin, atau setidaknya menawarkan kesempatan kepada pemanggil Anda untuk melakukannya. Di situlah menulis metode Dispose () Anda sendiri. Pada dasarnya, menerapkan IDisposable () melakukan dua hal untuk Anda:
Memungkinkan Anda untuk membuang sumber daya apa pun yang Anda ambil langsung dari sistem operasi di belakang punggung .NET (sumber daya tidak terkelola).
Memungkinkan Anda dan penelepon Anda melepaskan objek .NET yang besar dan kuat / objek .NET yang memegang sumber daya berharga di tangan kecil mereka yang kotor dan ingin dilepaskan sekarang .
Komentar: Dengan mengimplementasikan IDisposable
dan dengan demikian menyediakan Dispose()
metode, Anda memungkinkan pengguna kelas Anda untuk melepaskan dengan cara deterministik sumber daya tidak terkelola apa pun yang dipegang oleh sebuah instance kelas Anda.
1 Tautan awalnya dibagikan dalam jawaban Sachin Shanbhag . Materi yang dikutip bertanggal 2005-11-17. Perhatikan bahwa saya telah mengedit sedikit konten yang dikutip.
Perbedaan mendasar antara sumber daya yang dikelola dan tidak dikelola adalah bahwa pengumpul sampah mengetahui tentang semua sumber daya yang dikelola, pada suatu saat GC akan datang dan membersihkan semua memori dan sumber daya yang terkait dengan objek yang dikelola. GC tidak tahu tentang sumber daya yang tidak dikelola, seperti file, streaming, dan pegangan, jadi jika Anda tidak membersihkannya secara eksplisit dalam kode, Anda akan berakhir dengan kebocoran memori dan sumber daya yang terkunci.
Untuk detail lebih lanjut - http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources