เสร็จสิ้น
Finalize() ถูกเรียกโดย Garbage Collector ก่อนที่อ็อบเจ็กต์ที่มีสิทธิ์ได้รับการรวบรวมจะถูกเรียกคืน ตัวรวบรวมขยะจะรับผิดชอบในการจัดสรรคืนหน่วยความจำสำหรับอ็อบเจ็กต์ที่ไม่ได้อ้างอิง Garbage Collector เรียกวิธีนี้ในบางจุดหลังจากที่ไม่มีการอ้างอิงที่ถูกต้องไปยังวัตถุนั้นในหน่วยความจำอีกต่อไป
กรอบงานไม่ได้รับประกันว่าเมื่อใดที่สิ่งนี้จะเกิดขึ้น เราสามารถบังคับใช้ Garbage Collection ได้ แต่จะส่งผลเสียต่อประสิทธิภาพของโปรแกรม Finalize() เป็นของคลาส Object และจะถูกเรียกโดยรันไทม์
ตัวอย่าง
using System; namespace DemoApplication{ public class Demo{ ~Demo(){ Console.WriteLine("Finalize called"); } } }
ทิ้ง
มีทรัพยากรบางอย่าง เช่น ตัวจัดการหน้าต่าง การเชื่อมต่อฐานข้อมูล การเชื่อมต่อเครือข่าย ไฟล์ ฯลฯ ซึ่ง Garbage Collector ไม่สามารถรวบรวมได้ หากเราต้องการเปิดเผยออบเจ็กต์บางอย่างอย่างชัดเจน วิธีที่ดีที่สุดในการใช้ IDisposable และแทนที่เมธอด Dispose() ของอินเทอร์เฟซ IDisposable
เมธอด Dispose() จะไม่ถูกเรียกโดยอัตโนมัติ และเราต้องเรียกมันอย่างชัดเจนจากแอปพลิเคชันไคลเอนต์เมื่อไม่ต้องการอ็อบเจ็กต์อีกต่อไป Dispose() สามารถเรียกได้แม้ว่าการอ้างอิงถึงวัตถุอื่น ๆ จะยังมีชีวิตอยู่ก็ตาม
ตัวอย่าง
using System; namespace DemoApplication{ public class Demo : IDisposable{ private bool disposed = false; public void Dispose(){ Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing){ if (!disposed){ if (disposing){ //clean up managed objects } //clean up unmanaged objects disposed = true; } } } }
Microsoft แนะนำให้เราใช้ทั้ง Dispose และ Finalize เมื่อทำงานกับทรัพยากรที่ไม่มีการจัดการ การใช้งาน Finalize จะทำงานและทรัพยากรจะยังคงถูกปล่อยเมื่อวัตถุถูกรวบรวมขยะแม้ว่านักพัฒนาจะละเลยการเรียกวิธีการ Dispose อย่างชัดเจน