DataSet dan DataTable keduanya mengimplementasikan IDisposable, jadi, dengan praktik terbaik konvensional, saya harus memanggil metode Buang () mereka.
Namun, dari apa yang saya baca sejauh ini, DataSet dan DataTable sebenarnya tidak memiliki sumber daya yang tidak dikelola, jadi Buang () sebenarnya tidak banyak berbuat.
Plus, saya tidak bisa hanya menggunakan using(DataSet myDataSet...)
karena DataSet memiliki koleksi DataTables.
Jadi, agar aman, saya harus beralih melalui myDataSet.Table, buang masing-masing DataTable, lalu buang DataSet.
Jadi, apakah perlu untuk memanggil Buang () pada semua DataSets dan DataTables saya?
Tambahan:
Bagi Anda yang berpikir bahwa DataSet harus dibuang: Secara umum, pola untuk membuang adalah menggunakan using
atau try..finally
, karena Anda ingin menjamin bahwa Buang () akan dipanggil.
Namun, ini menjadi sangat cepat untuk koleksi. Misalnya, apa yang Anda lakukan jika salah satu panggilan untuk Buang () melemparkan pengecualian? Apakah Anda menelannya (yang "buruk") sehingga Anda dapat melanjutkan untuk membuang elemen berikutnya?
Atau, apakah Anda menyarankan saya panggil myDataSet.Dispose (), dan lupakan tentang membuang DataTables di myDataSet.Tables?
Jawaban:
Berikut adalah beberapa diskusi yang menjelaskan mengapa Buang tidak diperlukan untuk DataSet.
Membuang atau Tidak Membuang? :
Haruskah Buang dipanggil pada objek DataTable dan DataSet? termasuk beberapa penjelasan dari MVP:
Memahami metode Buang dan kumpulan data? memiliki dengan komentar dari otoritas Scott Allen:
Jadi, konsensus ada bahwa saat ini tidak ada alasan yang baik untuk memanggil Buang di DataSet.
sumber
using
blok terserah Anda.Pembaruan (1 Desember 2009):
Saya ingin mengubah jawaban ini dan mengakui bahwa jawaban yang asli salah.
Analisis asli memang berlaku untuk objek yang membutuhkan finalisasi - dan titik bahwa praktik tidak boleh diterima di permukaan tanpa pemahaman yang akurat dan mendalam masih berlaku.
Namun, ternyata DataSets, DataViews, DataTables menekan finalisasi dalam konstruktor mereka - inilah mengapa memanggil Buang () pada mereka secara eksplisit tidak melakukan apa-apa.
Agaknya, ini terjadi karena mereka tidak memiliki sumber daya yang tidak dikelola; jadi terlepas dari kenyataan bahwa MarshalByValueComponent membuat penyisihan untuk sumber daya yang tidak dikelola, implementasi khusus ini tidak memiliki kebutuhan dan karenanya dapat melupakan finalisasi.
(Bahwa. NET penulis akan berhati-hati untuk menekan finalisasi pada tipe yang biasanya menempati sebagian besar memori berbicara tentang pentingnya praktik ini secara umum untuk tipe yang dapat diselesaikan.)
Sekalipun demikian, detail-detail ini masih kurang didokumentasikan sejak dimulainya .NET Framework (hampir 8 tahun yang lalu) cukup mengejutkan (bahwa Anda pada dasarnya dibiarkan menggunakan perangkat Anda sendiri untuk menyaring material yang bertentangan namun ambigu untuk menyatukan potongan-potongan tersebut. kadang membuat frustasi tetapi memberikan pemahaman yang lebih lengkap tentang kerangka kerja yang kita andalkan sehari-hari).
Setelah banyak membaca, inilah pemahaman saya:
Jika suatu objek membutuhkan finalisasi, ia dapat menempati memori lebih lama dari yang seharusnya - inilah alasannya: a) Setiap jenis yang mendefinisikan destruktor (atau mewarisi dari tipe yang mendefinisikan destruktor) dianggap dapat diselesaikan; b) Pada alokasi (sebelum konstruktor berjalan), sebuah pointer ditempatkan pada antrian Finalisasi; c) Objek yang dapat diselesaikan biasanya membutuhkan 2 koleksi untuk direklamasi (bukan standar 1); d) Menekan finalisasi tidak menghapus objek dari antrian finalisasi (seperti yang dilaporkan oleh! FinalizeQueue di SOS) Perintah ini menyesatkan; Mengetahui objek apa yang ada pada antrian finalisasi (dengan sendirinya) tidak membantu; Mengetahui objek apa yang ada pada antrian finalisasi dan masih membutuhkan finalisasi akan sangat membantu (apakah ada perintah untuk ini?)
Menekan finalisasi sedikit mematikan di header objek yang mengindikasikan ke runtime bahwa ia tidak perlu meminta Finalizer-nya dipanggil (tidak perlu memindahkan antrian FReachable); Masih dalam antrian Finalisasi (dan terus dilaporkan oleh! FinalizeQueue di SOS)
Kelas DataTable, DataSet, DataView semuanya di-root di MarshalByValueComponent, objek yang dapat diselesaikan yang dapat (berpotensi) menangani sumber daya yang tidak dikelola
4 (referensi baru):
Jawaban asli:
Ada banyak jawaban yang menyesatkan dan umumnya sangat buruk tentang ini - siapa pun yang mendarat di sini harus mengabaikan kebisingan dan membaca referensi di bawah ini dengan cermat.
Tanpa ragu, Buang harus dipanggil pada objek yang dapat diselesaikan .
DataTables yang Finalizable.
Memanggil Buang secara signifikan mempercepat pengambilan kembali memori.
Panggilan MarshalByValueComponent GC.SuppressFinalize (this) dalam Buangnya ( ) - melewatkan ini berarti harus menunggu puluhan jika tidak ratusan koleksi Gen0 sebelum memori direklamasi:
Ambillah dari seseorang yang melihat 100 MB dari DataTables yang tidak direferensikan di Gen2: ini sangat penting dan benar-benar terlewatkan oleh jawaban di utas ini.
Referensi:
1 - http://msdn.microsoft.com/en-us/library/ms973837.aspx
2 - http://vineetgupta.spaces.live.com/blog/cns!8DE4BDC896BEE1AD!1104.entry http://www.dotnetfunda.com/articles/article524-net-best-practice-no-2-improve-garbage -collector-performance-using-finalizedispose-pattern.aspx
3 - http://codeidol.com/csharp/net-framework/Inside-the-CLR/Automatic-Memory-Management/
sumber
TableAdapter
?Anda harus menganggap itu melakukan sesuatu yang berguna dan memanggil Buang meskipun itu tidak melakukan apa-apa saat ini. Inkarnasi Framework NET, tidak ada jaminan itu akan tetap seperti itu di versi masa depan yang mengarah pada penggunaan sumber daya yang tidak efisien.
sumber
DataTable
tidak disegel - bukan masalah besar ketika Anda melakukannyanew DataTable
, tetapi cukup penting ketika mengambilDataTable
sebagai argumen atau sebagai hasil dari pemanggilan metode.Bahkan jika objek tidak memiliki sumber daya yang tidak dikelola, membuang mungkin membantu GC dengan memecah grafik objek. Secara umum, jika objek mengimplementasikan IDisposable maka Buang () harus dipanggil.
Apakah Buang () sebenarnya melakukan sesuatu atau tidak tergantung pada kelas yang diberikan. Dalam hal DataSet, Buang implementasi () diwarisi dari MarshalByValueComponent. Ini menghapus dirinya dari wadah dan memanggil acara yang dibuang. Kode sumber di bawah ini (dibongkar dengan .NET Reflector):
sumber
Apakah Anda membuat DataTable sendiri? Karena iterasi melalui anak-anak dari Obyek apa pun (seperti dalam DataSet. Tabel) biasanya tidak diperlukan, karena itu tugas Orangtua untuk membuang semua anggota anak itu.
Secara umum, aturannya adalah: Jika Anda membuatnya dan mengimplementasikan IDisposable, Buang. Jika Anda TIDAK membuatnya, maka JANGAN membuangnya, itu pekerjaan dari objek induk. Tetapi setiap objek mungkin memiliki aturan khusus, periksa Dokumentasi.
Untuk .net 3.5, secara eksplisit tertulis "Buang ketika tidak menggunakan lagi", jadi itulah yang akan saya lakukan.
sumber
Saya sebut buang kapan saja objek mengimplementasikan IDisposeable. Itu ada di sana karena suatu alasan.
DataSets bisa menjadi babi memori yang sangat besar. Semakin cepat mereka ditandai untuk dibersihkan, semakin baik.
memperbarui
Sudah 5 tahun sejak saya menjawab pertanyaan ini. Saya masih setuju dengan jawaban saya. Jika ada metode buang, itu harus dipanggil ketika Anda selesai dengan objek. Antarmuka IDispose diimplementasikan karena suatu alasan.
sumber
Jika maksud Anda atau konteks pertanyaan ini benar-benar pengumpulan sampah, maka Anda dapat mengatur dataset dan data menjadi null secara eksplisit atau menggunakan kata kunci menggunakan dan membiarkannya keluar dari ruang lingkup. Buang tidak berbuat banyak seperti yang dikatakan Tetraneutron sebelumnya. GC akan mengumpulkan objek dataset yang tidak lagi direferensikan dan juga yang berada di luar cakupan.
Saya benar-benar berharap SO memaksa orang agar memilih untuk benar-benar menulis komentar sebelum menurunkan jawabannya.
sumber
Kumpulan data mengimplementasikan IDisposable MarshalByValueComponent menyeluruh, yang mengimplementasikan IDisposable. Karena kumpulan data dikelola, tidak ada manfaat nyata dari panggilan buang.
sumber
Coba gunakan fungsi Hapus (). Ini bekerja bagus untuk saya saat membuang.
sumber
sumber