Destructors

ศศิรัตน์ บริสุทธิ์ 650710583

Destructor คืออะไร

Destructor ในภาษา C# เป็น specialized เมธอด ภายในคลาสใช้ในการทำลายอินสแตนซ์ของคลาสที่ไม่ได้ใช้งานอีกต่อไป หรือวัตถุที่อยู่นอกขอบเขต (Scope) ซึ่งตัว destructor จะถูกเรียกอัตโนมัติโดยกระบวนการจัดการหน่วยความจำอัตโนมัติ Garbage Collector ของ .NET framework ช่วยในการจัดการ จัดสรร ทรัพยากร ขอบเขตการทำงาน ทำให้นักพัฒนาสามารถปล่อยทรัพยากรที่ไม่มีการจัดการอย่างเป็นระบบได้ เช่น การจัดการไฟล์, การเชื่อมต่อฐานข้อมูล หรือการเชื่อมต่อเครือข่าย (Network socket)

ลักษณะสำคัญของ Destructor

  • Destructor สามารถมีได้เพียงตัวเดียวภายในคลาส

  • ในการสร้าง destructor สร้างได้โดยการใส่สัญลักษณ์เครื่องหมายตัวหนอน (~) ด้านหน้าชื่อของ destructor ซึ่งต้องเป็นชื่อเดียวกับคลาส ทำให้ destrctor แตกต่างจาก constructor

  • Destructor ไม่มีการส่งค่าคืนและไม่มีการรับ parameter หรือ modifier ใด ๆ

  • Destuctor ไม่สามารถใช้ใน structure ใช้ได้เพียงในคลาสเท่านั้น

  • ไม่สามารถโอเวอร์โหลดหรือสืบทอด destructor ได้

เมื่อโปรแกรมจบลง destructor จะเรียกใช้ เมธอด Finalize บนคลาสของอ็อบเจ็กต์

รูปภาพจาก ironpdf : https://ironpdf.com/blog/net-help/csharp-destructor-guide/

โดยทั่วไปแล้ว C# ไม่ต้องการการจัดการหน่วยความจำจากนักพัฒนามากเท่ากับภาษาอื่น ๆ ที่ไม่มีกระบวนการจัดการหน่วยความจำอัตโนมัติ (garbage collection) เนื่องจาก .NET garbage collector จะจัดการการจัดสรรและการปล่อยหน่วยความจำของวัตถุโดยอัตโนมัติ แต่ในกรณีที่โปรแกรมมีการใช้ทรัพยากรที่ไม่มีการจัดการ (unmanaged resources) เช่น การจัดการไฟล์ และการเชื่อมต่อเครือข่าย ควรใช้ Destructor เพื่อปล่อยทรัพยากร ให้วัตถุมีสิทธิ์ในการทำ finalization ตัว garbage collector จะเรียกใช้เมธอด Finalize ของวัตถุ

นักพัฒนา C# มักจะใช้คำสั่ง using ร่วมกับวัตถุที่ใช้อินเตอร์เฟซ IDisposable ซึ่งจะช่วยให้สามารถปล่อยทรัพยากรได้อย่างทันท่วงที มีความแน่นอน และน่าเชือถือ ทำให้ Destructor ถูกใช้น้อยลงใน C# ปัจจุบัน อย่างไรก็ตาม การทำความเข้าใจการใช้ Destructor ยังคงมีความสำคัญสำหรับสถานการณ์ที่ต้องการการจัดการทรัพยากรโดยตรง

ตัวอย่าง Destructor ใน C#

class Test {
  ...
  //destructor
  ~Test() {
    ...
  }
}

Destructor ต้องมีชื่อเดียวกับ class และมีสัญลักษณ์ ~ (ตัวหนอน) ด้านหน้า

using System;  
   public class Employee  
    {  
        public Employee()  
        {  
            Console.WriteLine("Constructor Invoked");  
        }  
        ~Employee()  
        {  
            Console.WriteLine("Destructor Invoked");  
        }  
    }  
   class TestEmployee{  
       public static void Main(string[] args)  
        {  
            Employee e1 = new Employee();  
        }  
    }  

เมื่อเราสร้างอ็อบเจ็กต์ของคลาส Employee ทำให้มีการเรียกใช้ constructor โดยหลังจากที่ขอบเขตของอ็อบเจ็กต์สิ้นสุดลงและไม่จำเป็นต้องใช้อ็อบเจ็กต์ e1 อีกต่อไปแล้ว ตัว destructor จะถูกเรียกใช้โดยอัตโนมัติเพื่อจะทำลายวัตถุ e1

Output :

Constructor Invoked
Destructor Invoked

เปรียบเทียบ Destructor ในภาษา Java, C และ Python

Destructor ในภาษา Java

ใน Java ไม่มีแนวคิดเกี่ยวกับ Destructor เนื่องจากมีการจัดการสรรจัด และปล่อยทรัพยากรด้วย garbage collector เช่นเดียวกันกับ C# ซึ่ง garbage collector ใน Java เป็นโปรแกรม (เธรด) ที่ทำงานบน JVM จะทำการลบวัตถุที่ไม่ได้ใช้งานโดยอัตโนมัติ และปล่อยหน่วยความจำ โดยที่นักพัฒนาไม่จำเป็นต้องจัดการหน่วยความจำด้วยตนเอง แต่ใน Java มีเมธอด finalize() ที่ทำงานแบบ Destructor ช่วยให้แน่ใจว่าได้ปล่อยทรัพยากรก่อนที่จะปิดโปรแกรม แต่ปัจจุบันใน Java เวอร์ชั่นใหม่ไม่มีการใช้ finalize()แล้ว

ตัวอย่าง Destructor ใน Java

public class DestructorExample {
    protected void finalize() {
        System.out.println("Object is destroyed by the Garbage Collector");
    }
    public static void main(String[] args) {
        DestructorExample de = new DestructorExample();
        de.finalize();
        de = null;
        System.gc();
        System.out.println("Inside the main() method");
    }
}

Output :

Object is destroyed by the Garbage Collector
Inside the main() method
Object is destroyed by the Garbage Collector

Destructor ในภาษา C

Destructor ในภาษา C จะทำได้โดยการเรียกใช้ delete เพื่อจะทำการปล่อยหน่วยความจำให้สามารถใช้งานได้ต่อไป ซึ่ง destructor ในภาษา C ต้องถูกกำหนดโดยนักพัฒนาเพื่อให้ทำงานได้ เพราะหากไม่มีการกำหนด destructor วัตถุจะยังคงอยู่ในหน่วยความจำจนกว่าจะถูกลบออกด้วยตนเอง

class book {  
public:    
    // destructor    
    ~book() {       
        delete this;     
    }
};

Destructor ในภาษา Python

Destructor ใน python เป็นเมธอดที่ถูกเรียกเมื่อวัตถุกำลังจะถูกทำลายหรือถูกลบออกจากหน่วยความจำ มีการประกาศเป็น __del__เพื่อระบุการเป็น destructor ภายในคลาส และตัว python ก็มีระบบ garbage collector เช่นเดียวกันกับ C# เช่นกันในการปล่อยทรัพยากรโปรแกรม

ตัวอย่าง Destructor ใน Python

# Python program to illustrate destructor
class Employee:

    def __init__(self):
        print('Employee created.')

    # Deleting (Calling destructor)
    def __del__(self):
        print('Destructor called, Employee deleted.')

obj = Employee()
del obj

Output :

Employee created.
Destructor called, Employee deleted.

Video present

presentation (slides)

อ้างอิง

what is destructor and important features :

manasikirloskar.( 1 กุมภาพันธ์ 2562 ).Destructors in C#.geeksforgeeks.https://www.geeksforgeeks.org/destructors-in-c-sharp/

tutorialspoint.( ม.ป.ป ).C# - Classes.tutorialspoint.https://www.tutorialspoint.com/csharp/csharp_classes.htm

IronPDF.( 24 ธันวาคม 2566 ).C# Destructor (How it Works For Developers).ironpdf.https://www.tutorialspoint.com/csharp/csharp_classes.htm

Finalizers and important features :

BillWagner.( 14 มีนาคม 2566 ).Finalizers (C# Programming Guide).microsoft.https://www.tutorialspoint.com/csharp/csharp_classes.htm

Example destructor code in C# :

javatpoint.( ม.ป.ป ).C# Destructor.javatpoint.https://www.tutorialspoint.com/csharp/csharp_classes.htm

Destructor in Java :

javatpoint.( ม.ป.ป ).Java Destructor.javatpoint.https://www.javatpoint.com/java-destructor

Destructor in C :

Nisha Kumari.( ม.ป.ป ).C Destructor: C Explained.bito.https://bito.ai/resources/c-destructor-c-explained/

Destructor in Python :

vivekkothari.( 9 สิงหาคม 2567 ).Destructors in Python.geeksforgeeks.https://www.tutorialspoint.com/csharp/csharp_classes.htm

Last updated