Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Finalize และ Dispose ใน C # แตกต่างกันอย่างไร


เสร็จสิ้น

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 อย่างชัดเจน