Sebagai contoh:
public class Person
{
public Person()
{
}
~Person()
{
}
}
Kapan saya harus membuat destruktor secara manual? Kapan Anda perlu membuat destruktor?
Sebagai contoh:
public class Person
{
public Person()
{
}
~Person()
{
}
}
Kapan saya harus membuat destruktor secara manual? Kapan Anda perlu membuat destruktor?
Jawaban:
UPDATE: Pertanyaan ini adalah topik blog saya pada bulan Mei 2015 . Terima kasih atas pertanyaannya! Lihat blog untuk daftar panjang kepalsuan yang orang percayai tentang finalisasi.
Kapan saya harus membuat destruktor secara manual?
Hampir tidak pernah.
Biasanya satu hanya menciptakan destruktor ketika kelas Anda berpegang pada beberapa sumber daya tidak terkelola mahal yang harus dibersihkan ketika objek hilang. Lebih baik menggunakan pola sekali pakai untuk memastikan bahwa sumber daya dibersihkan. Destructor pada dasarnya adalah sebuah jaminan bahwa jika konsumen objek Anda lupa untuk membuangnya, sumber daya itu akan tetap dibersihkan pada akhirnya. (Mungkin.)
Jika Anda membuat destruktor, berhati - hatilah dan pahami cara kerja pemulung . Destructors sangat aneh :
Hampir tidak ada yang biasanya benar dalam destruktor. Berhati-hatilah. Menulis destruktor yang benar sangat sulit.
Kapan Anda perlu membuat destruktor?
Saat menguji bagian dari kompiler yang menangani destruktor. Saya tidak pernah perlu melakukannya dalam kode produksi. Saya jarang menulis objek yang memanipulasi sumber daya yang tidak dikelola.
Ini disebut "finalizer", dan Anda biasanya hanya harus membuat satu untuk kelas yang statusnya (yaitu: bidang) mencakup sumber daya yang tidak dikelola (yaitu: pointer untuk menangani diambil melalui p / memanggil panggilan). Namun, di .NET 2.0 dan yang lebih baru, sebenarnya ada cara yang lebih baik untuk menangani pembersihan sumber daya yang tidak dikelola: SafeHandle . Dengan ini, Anda seharusnya tidak perlu menulis finalizer lagi.
Anda tidak memerlukannya kecuali kelas Anda mengelola sumber daya yang tidak dikelola seperti pegangan file Windows.
Ini disebut destructor / finalizer, dan biasanya dibuat saat menerapkan pola Disposed.
Ini adalah solusi mundur ketika pengguna kelas Anda lupa menelepon Buang, untuk memastikan bahwa (akhirnya) sumber daya Anda dilepaskan, tetapi Anda tidak memiliki jaminan kapan pun destruktor dipanggil.
Dalam pertanyaan Stack Overflow ini , jawaban yang diterima dengan benar menunjukkan bagaimana menerapkan pola buang. Ini hanya diperlukan jika kelas Anda mengandung sumber daya tidak tertangani yang tidak dikelola oleh pengumpul sampah untuk membersihkannya sendiri.
Praktik yang baik adalah tidak mengimplementasikan finalizer tanpa juga memberi pengguna kelas kemungkinan untuk secara manual Membuang objek untuk membebaskan sumber daya segera.
Ketika Anda memiliki sumber daya yang tidak dikelola dan Anda perlu memastikan mereka akan dibersihkan ketika objek Anda hilang. Contoh yang bagus adalah objek COM atau Penangan File.
Saya telah menggunakan destruktor (hanya untuk keperluan debug) untuk melihat apakah suatu objek sedang dibersihkan dari memori dalam lingkup aplikasi WPF. Saya tidak yakin apakah pengumpulan sampah benar-benar membersihkan objek dari memori, dan ini adalah cara yang baik untuk memverifikasi.
Destructors menyediakan cara implisit untuk membebaskan sumber daya yang tidak dikelola yang dikemas dalam kelas Anda, mereka dipanggil ketika GC menyiasatinya dan mereka secara implisit memanggil metode Finalisasi dari kelas dasar. Jika Anda menggunakan banyak sumber daya yang tidak dikelola, lebih baik menyediakan cara eksplisit untuk membebaskan sumber daya tersebut melalui antarmuka IDisposable. Lihat panduan pemrograman C #: http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx