C # 2008
ฉันทำงานนี้มาระยะหนึ่งแล้วและฉันยังสับสนเกี่ยวกับการใช้ขั้นตอนสุดท้ายและการกำจัดในโค้ด คำถามของฉันอยู่ด้านล่าง:
ฉันรู้ว่าเราต้องการเครื่องมือขั้นสุดท้ายขณะที่ทิ้งทรัพยากรที่ไม่มีการจัดการ อย่างไรก็ตามหากมีการจัดการทรัพยากรที่โทรไปยังทรัพยากรที่ไม่มีการจัดการมันจะยังคงต้องใช้ตัวเลือกสุดท้าย
อย่างไรก็ตามหากฉันพัฒนาคลาสที่ไม่ได้ใช้ทรัพยากรที่ไม่มีการจัดการไม่ว่าทางตรงหรือทางอ้อมฉันควรใช้
IDisposable
เพื่ออนุญาตให้ลูกค้าของคลาสนั้นใช้ 'การใช้คำสั่ง' หรือไม่เป็นไปได้ไหมที่จะใช้ IDisposable เพียงเพื่อให้ลูกค้าในชั้นเรียนของคุณใช้คำสั่ง use
using(myClass objClass = new myClass()) { // Do stuff here }
ฉันได้พัฒนาโค้ดง่าย ๆ ด้านล่างนี้เพื่อสาธิตการใช้งานสุดท้าย / กำจัดทิ้ง:
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); } }
คำถามเกี่ยวกับซอร์สโค้ด:
ที่นี่ฉันยังไม่ได้เพิ่ม finalizer และโดยปกติแล้ว finalizer จะถูกเรียกโดย GC และ Finalizer จะเรียก Dispose เนื่องจากฉันไม่มีตัวปรับขั้นสุดท้ายฉันจะเรียกวิธีการทิ้งเมื่อใด เป็นลูกค้าของคลาสที่ต้องเรียกมันหรือไม่?
ดังนั้นคลาสของฉันในตัวอย่างนี้เรียกว่า NoGateway และลูกค้าสามารถใช้และกำจัดคลาสแบบนี้ได้:
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
วิธีการกำจัดจะถูกเรียกโดยอัตโนมัติเมื่อการดำเนินการถึงจุดสิ้นสุดของบล็อกที่ใช้หรือลูกค้าต้องเรียกวิธีการกำจัดด้วยตนเองหรือไม่? กล่าวคือ
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
ฉันกำลังใช้
WebClient
ชั้นเรียนในNoGateway
ชั้นเรียนของฉัน เนื่องจากWebClient
ใช้IDisposable
อินเทอร์เฟซนี่หมายความว่าWebClient
ใช้ทรัพยากรที่ไม่มีการจัดการทางอ้อมหรือไม่ มีกฎที่ยากและรวดเร็วในการติดตามหรือไม่ ฉันจะรู้ได้อย่างไรว่าคลาสใช้ทรัพยากรที่ไม่มีการจัดการ