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 =newSqlConnection("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.
Saya akan menjelaskannya sedikit: "sumber daya yang tidak terkelola" adalah sesuatu yang tidak akan diketahui oleh pengumpul sampah setelahnya jika ditinggalkan. Langganan objek berumur pendek ke acara dari objek berumur panjang, misalnya, akan menjadi sumber daya yang tidak terkelola meskipun kedua objek berada di bawah kendali pengumpul sampah, karena GC tidak akan mengetahui bahwa langganan tersebut harus dibuang jika pelanggan ditinggalkan tetapi penerbit tidak. Jika jumlah pelanggan yang tidak terbatas dapat dibuat dan ditinggalkan selama masa penerbitan, itu akan menyebabkan kebocoran memori.
supercat
12
Menambahkan sedikit lebih banyak klarifikasi: SqlConnection (atau FileStream, dll) adalah sumber daya yang dikelola yang secara internal menggunakan sumber daya tidak terkelola yang tidak disadari oleh GC.
jimvfr
2
jimvfr benar, SqlConnection adalah contoh sumber daya yang dikelola. Contoh sumber daya yang tidak dikelola adalah ketika kita perlu mengalokasikan memori dari memori yang tidak dikelola menggunakan metode Marshal.AllocHGlobal () itu adalah sumber daya yang tidak dikelola dalam hal ini praktik terbaiknya adalah menggunakan destruktor (~ ctor) dan memanggil Marshal.FreeHGlobal () untuk melepaskan ingatan ini.
Ygor Thomaz
dapatkah Anda memberi contoh untuk sumber daya yang dikelola dan yang tidak.
Radha Manohar
32
Sumber daya yang dikelola adalah yang merupakan kode NET murni dan dikelola oleh runtime dan berada di bawah kendali langsungnya.
Sumber daya yang tidak terkelola adalah yang tidak. Menangani file, memori yang disematkan, objek COM, koneksi database, dll.
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 IDisposabledan 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.
"Ide di balik antarmuka IDisposable adalah membiarkan Anda membersihkan sumber daya dengan cara deterministik dan membersihkan sumber daya yang tidak terkelola."
zionpi
0
Sumber daya yang dikelola adalah sumber daya yang dapat dibebaskan oleh pengumpul sampah dan sumber daya yang tidak dikelola tidak dapat dibebaskan oleh pengumpul sampah untuk tujuan ini, destruktor diperlukan.
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:
Karena ini memastikan yang
.Dispose()
dipanggil pada objek koneksi, memastikan bahwa sumber daya yang tidak dikelola dibersihkan.sumber
Sumber daya yang dikelola adalah yang merupakan kode NET murni dan dikelola oleh runtime dan berada di bawah kendali langsungnya.
Sumber daya yang tidak terkelola adalah yang tidak. Menangani file, memori yang disematkan, objek COM, koneksi database, dll.
sumber
Dalam Tanya Jawab Apa itu sumber daya yang tidak terkelola? 1 , Bruce Wood memposting yang berikut ini:
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).
Komentar: Dengan mengimplementasikan
IDisposable
dan dengan demikian menyediakanDispose()
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.
sumber
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
sumber
Sumber daya yang dikelola adalah sumber daya yang dapat dibebaskan oleh pengumpul sampah dan sumber daya yang tidak dikelola tidak dapat dibebaskan oleh pengumpul sampah untuk tujuan ini, destruktor diperlukan.
sumber