C # 2008
Saya telah mengerjakan ini untuk sementara waktu sekarang, dan saya masih bingung tentang penggunaan metode finalisasi dan buang dalam kode. Pertanyaan saya di bawah ini:
Saya tahu bahwa kita hanya perlu penyelesai sementara membuang sumber daya yang tidak dikelola. Namun, jika ada sumber daya yang dikelola yang membuat panggilan ke sumber daya yang tidak dikelola, apakah masih perlu menerapkan finalizer?
Namun, jika saya mengembangkan kelas yang tidak menggunakan sumber daya yang tidak dikelola - langsung atau tidak langsung, haruskah saya mengimplementasikannya
IDisposable
agar klien dari kelas itu dapat menggunakan 'pernyataan penggunaan'?Apakah layak menerapkan IDisposable hanya untuk memungkinkan klien kelas Anda menggunakan pernyataan menggunakan?
using(myClass objClass = new myClass()) { // Do stuff here }
Saya telah mengembangkan kode sederhana di bawah ini untuk menunjukkan penyelesaian / buang penggunaan:
public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += wc_DownloadStringCompleted; } // Start the Async call to find if NoGateway is true or false public void NoGatewayStatus() { // Start the Async's download // Do other work here wc.DownloadStringAsync(new Uri(www.xxxx.xxx)); } private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { // Do work here } // Dispose of the NoGateway object public void Dispose() { wc.DownloadStringCompleted -= wc_DownloadStringCompleted; wc.Dispose(); GC.SuppressFinalize(this); } }
Pertanyaan tentang kode sumber:
Di sini saya belum menambahkan finalizer, dan biasanya finalizer akan dipanggil oleh GC, dan finalizer akan memanggil Buang. Karena saya tidak memiliki finalizer, kapan saya memanggil metode Buang? Apakah klien dari kelas yang harus memanggilnya?
Jadi kelas saya dalam contoh disebut NoGateway dan klien dapat menggunakan dan membuang kelas seperti ini:
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
Apakah metode Buang dipanggil secara otomatis ketika eksekusi mencapai akhir blok penggunaan, atau apakah klien harus memanggil metode buang secara manual? yaitu
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
Saya menggunakan
WebClient
kelas diNoGateway
kelas saya . KarenaWebClient
mengimplementasikanIDisposable
antarmuka, apakah ini berartiWebClient
secara tidak langsung menggunakan sumber daya yang tidak dikelola? Apakah ada aturan yang keras dan cepat untuk mengikuti ini? Bagaimana saya tahu bahwa suatu kelas menggunakan sumber daya yang tidak dikelola?