Buang Objek dalam Visual Basic

Dalam artikelnya, Coding Contoh Baru Objek, saya menulis tentang berbagai cara itu Baru contoh objek dapat dibuat. Masalah sebaliknya, membuang objek, adalah sesuatu yang Anda tidak perlu khawatirkan di VB.NET sangat sering. .NET mencakup teknologi yang disebut Pemulung (GC) yang biasanya menangani semuanya di belakang layar secara diam-diam dan efisien. Tapi kadang-kadang, biasanya ketika menggunakan aliran file, objek sql atau objek grafik (GDI +) (yaitu, sumber daya yang tidak dikelola), Anda mungkin perlu mengendalikan objek yang dibuang di kode Anda sendiri.

Pertama, Latar Belakang

Sama seperti a menipustructor (yang Baru kata kunci) membuat yang baru obyek, Sebuah destructor adalah metode yang disebut ketika suatu objek dihancurkan. Tapi ada tangkapan. Orang-orang yang membuat .NET menyadari bahwa itu adalah formula untuk bug jika dua bagian kode yang berbeda dapat benar-benar menghancurkan objek. Jadi. NET GC sebenarnya dalam kontrol dan biasanya satu-satunya kode yang dapat menghancurkan instance objek. GC menghancurkan objek saat ia memutuskan dan tidak sebelumnya. Biasanya, setelah objek meninggalkan ruang lingkup, itu

instagram viewer
dilepaskan oleh runtime bahasa umum (CLR). GC menghancurkan keberatan ketika CLR membutuhkan lebih banyak memori bebas. Jadi intinya adalah bahwa Anda tidak dapat memprediksi kapan GC akan benar-benar menghancurkan objek.

(Baiklah... Itu benar hampir setiap waktu. Anda bisa menelepon GC.Collect dan memaksa a siklus pengumpulan sampah, tetapi pihak berwenang secara universal mengatakan itu adalah buruk ide dan sama sekali tidak perlu.)

Misalnya, jika kode Anda telah membuat a Pelanggan objek, mungkin tampak bahwa kode ini akan menghancurkannya lagi.

Pelanggan = Tidak Ada

Tapi ternyata tidak. (Mengatur objek ke Tidak ada yang biasa disebut, dereferencing objek.) Sebenarnya, itu hanya berarti bahwa variabel tidak berhubungan dengan objek lagi. Beberapa waktu kemudian, GC akan melihat bahwa objek tersedia untuk dihancurkan.

Omong-omong, untuk objek yang dikelola, semua ini tidak benar-benar diperlukan. Meskipun objek seperti Button akan menawarkan metode Buang, itu tidak perlu untuk digunakan dan beberapa orang melakukannya. Komponen Windows Forms, misalnya, ditambahkan ke objek kontainer bernama komponen. Saat Anda menutup formulir, metode Buangnya disebut secara otomatis. Biasanya, Anda hanya perlu khawatir tentang semua ini ketika menggunakan objek yang tidak dikelola, dan itupun hanya untuk optomize program Anda.

Cara yang disarankan untuk melepaskan sumber daya apa pun yang mungkin dipegang oleh suatu objek adalah dengan memanggil Membuang metode untuk objek (jika ada) dan kemudian referensi objek.

Pelanggan. Membuang() Pelanggan = Tidak Ada

Karena GC akan menghancurkan objek yatim, apakah Anda mengatur variabel objek menjadi Tidak atau tidak, itu tidak benar-benar diperlukan.

Cara lain yang disarankan untuk memastikan bahwa objek dihancurkan saat tidak diperlukan lagi adalah dengan memasukkan kode yang menggunakan objek ke dalam Menggunakan blok. Blok Menggunakan menjamin pembuangan satu atau lebih sumber daya seperti itu ketika kode Anda selesai dengan mereka.

Dalam seri GDI +, the Menggunakan blok dimasukkan untuk menggunakan cukup sering untuk mengelola objek-objek grafis yang sial. Sebagai contoh ...

Menggunakan myBrush Sebagai LinearGradientBrush _. = LinearGradientBrush Baru (_. Saya. ClientRectangle, _. Warna. Warna biru. Merah, _. LinearGradientMode. Horisontal) <... kode lain ...> Akhiri Penggunaan

myBrush dibuang secara otomatis ketika ujung blok dieksekusi.

Pendekatan GC untuk mengelola memori adalah perubahan besar dari cara VB6 melakukannya. Objek COM (digunakan oleh VB6) dihancurkan ketika penghitung referensi internal mencapai nol. Tapi itu terlalu mudah untuk membuat kesalahan sehingga penghitung internal dimatikan. (Karena memori diikat dan tidak tersedia untuk objek lain ketika ini terjadi, ini disebut "kebocoran memori".) Sebaliknya, GC sebenarnya memeriksa untuk melihat apakah ada yang mereferensikan suatu objek dan menghancurkannya ketika tidak ada lagi referensi. Pendekatan GC memiliki sejarah yang baik dalam bahasa seperti Java dan merupakan salah satu perbaikan besar dalam .NET.

Pada halaman berikutnya, kita melihat ke antarmuka IDisposable... antarmuka untuk digunakan saat Anda perlu Buang benda yang tidak dikelola dalam kode Anda sendiri.

Jika Anda memberi kode objek Anda sendiri yang menggunakan sumber daya yang tidak dikelola, Anda harus menggunakan IDisposable antarmuka untuk objek. Microsoft mempermudah ini dengan memasukkan cuplikan kode yang menciptakan pola yang tepat untuk Anda.


Klik di sini untuk menampilkan ilustrasi
Klik tombol Kembali di browser Anda untuk kembali

Kode yang ditambahkan terlihat seperti ini (VB.NET 2008):

 Kelas ResourceClass. Mengimplementasikan IDisposable. 'Untuk mendeteksi panggilan yang berlebihan. Pribadi dibuang Sebagai Boolean = Salah. 'IDisposable. Subpos Disingkirkan Overridable (_. ByVal membuang Sebagai Boolean) If Not Me. Jika membuang Lalu. 'Bebaskan negara lain (objek yang dikelola). Berakhir jika. 'Bebaskan negara Anda sendiri (benda yang tidak dikelola). 'Atur bidang besar ke nol. Berakhir jika. Me.disposed = Benar. End Sub. #Region "Dukungan IDisposable" 'Kode ini ditambahkan oleh Visual Basic ke. 'benar menerapkan pola pakai. Public Sub Dispose () Mengimplementasikan IDisposable. Membuang. 'Jangan mengubah kode ini. 'Masukkan kode pembersihan. 'Buang (ByVal disposing As Boolean) di atas. Buang (Benar) GC.SuppressFinalize (Me) End Sub. Sub Finalisasi Override Terlindungi () 'Jangan ubah kode ini. 'Masukkan kode pembersihan. 'Buang (ByVal disposing As Boolean) di atas. Buang (Salah) MyBase. Finalisasi () End Sub. Wilayah #End. Kelas Akhir 

Membuang hampir merupakan pola desain pengembang "yang dipaksakan" di .NET. Sebenarnya hanya ada satu cara yang benar untuk melakukannya dan ini dia. Anda mungkin berpikir kode ini melakukan sesuatu yang ajaib. Tidak.

Catatan pertama bahwa bendera internal cenderung cukup hubung singkat semuanya sehingga Anda dapat menelepon Buang (buang) sesering yang Anda suka.

Kode ...

 GC.SuppressFinalize (Me) 

... membuat kode Anda lebih efisien dengan memberi tahu GC bahwa objek telah dibuang (operasi 'mahal' dalam hal siklus eksekusi). Finalisasi Diproteksi karena GC menyebutnya secara otomatis ketika suatu objek dihancurkan. Anda seharusnya tidak pernah memanggil Selesaikan. Boolean membuang memberi tahu kode apakah kode Anda memulai pembuangan objek (True) atau apakah GC melakukannya (sebagai bagian dari Menyelesaikan sub. Perhatikan bahwa satu-satunya kode yang menggunakan Boolean membuang adalah:

 Jika membuang Lalu. 'Bebaskan negara lain (objek yang dikelola). Berakhir jika 

Ketika Anda membuang suatu objek, semua sumber dayanya harus dibuang. Saat CLR pemulung membuang suatu objek hanya sumber daya yang tidak dikelola harus dibuang karena pemulung secara otomatis menangani sumber daya yang dikelola.

Gagasan di balik potongan kode ini adalah Anda menambahkan kode untuk menangani objek yang dikelola dan tidak dikelola di lokasi yang ditunjukkan.

Saat Anda mendapatkan kelas dari a kelas dasar yang mengimplementasikan IDisposable, Anda tidak perlu mengganti metode dasar apa pun kecuali Anda menggunakan sumber daya lain yang juga perlu dibuang. Jika itu terjadi, kelas turunan harus mengesampingkan metode Buang (buang) kelas dasar untuk membuang sumber daya kelas turunan. Tapi ingat untuk memanggil metode Buang (buang) kelas dasar.

Subpos Buang Yang Dilindungi (ByVal disposing As Boolean) If Not Me. Jika membuang Lalu. 'Tambahkan kode Anda ke sumber daya yang dikelola gratis. Berakhir jika. 'Tambahkan kode Anda ke sumber daya gratis yang tidak dikelola. Berakhir jika. MyBase. Buang (buang) End Sub

Subjek bisa sedikit luar biasa. Tujuan dari penjelasan di sini adalah untuk "menghilangkan mitos" apa yang sebenarnya terjadi karena sebagian besar informasi yang Anda temukan tidak memberi tahu Anda!