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

# Destructors

## 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 บนคลาสของอ็อบเจ็กต์

<figure><img src="https://2358863655-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPtNVavcFSOLzLOmmCgv%2Fuploads%2F9OB2De4EmfPFwd5N3uB9%2Fc%23des.png?alt=media&#x26;token=cb511d2d-d58c-464d-af94-cbbbfc37b918" alt=""><figcaption><p>รูปภาพจาก ironpdf : <a href="https://ironpdf.com/blog/net-help/csharp-destructor-guide/">https://ironpdf.com/blog/net-help/csharp-destructor-guide/</a> </p></figcaption></figure>

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

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

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

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

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

```csharp
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 เนื่องจา&#xE01;_<mark style="color:green;">มีการจัดการสรรจัด และปล่อยทรัพยากรด้วย garbage collector เช่นเดียวกันกับ C#</mark>_ ซึ่ง garbage collector ใน Java เป็นโปรแกรม (เธรด) ที่ทำงานบน JVM จะทำการลบวัตถุที่ไม่ได้ใช้งานโดยอัตโนมัติ และปล่อยหน่วยความจำ โดยที่นักพัฒนาไม่จำเป็นต้องจัดการหน่วยความจำด้วยตนเอง แต่ใน Java มีเมธอด `finalize()` ที่ทำงานแบบ Destructor ช่วยให้แน่ใจว่าได้ปล่อยทรัพยากรก่อนที่จะปิดโปรแกรม แต่ปัจจุบันใน Java เวอร์ชั่นใหม่ไม่มีการใช้  `finalize()`แล้ว

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

```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 วัตถุจะยังคงอยู่ในหน่วยความจำจนกว่าจะถูกลบออกด้วยตนเอง

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

### Destructor ในภาษา Python

Destructor ใน python เป็นเมธอดที่ถูกเรียกเมื่อวัตถุกำลังจะถูกทำลายหรือถูกลบออกจากหน่วยความจำ มีการประกาศเป็น `__del__`เพื่อระบุการเป็น destructor ภายในคลาส และตัว python ก็มีระบบ _<mark style="color:green;">garbage collector เช่นเดียวกันกับ C# เช่นกันในการปล่อยทรัพยากรโปรแกรม</mark>_

#### &#x20;ตัวอย่าง Destructor ใน Python

```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

{% embed url="https://www.youtube.com/watch?v=NfQ112jnz58" %}

presentation (slides)

{% file src="https://2358863655-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPtNVavcFSOLzLOmmCgv%2Fuploads%2Frkwxcsyzo5WKLBF2c4UD%2FDestructors.pdf?alt=media&token=e9957550-0c67-47a0-aeb2-e8f10efe87ee" %}

### อ้างอิง

**what is destructor and important features :**

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

tutorialspoint.( ม.ป.ป ).C# - Classes.tutorialspoint.[https://www.tutorialspoint.com/csharp/csharp\_classes.htm](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](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](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/finalizers)

**Example destructor code in C# :**&#x20;

javatpoint.( ม.ป.ป ).C# Destructor.javatpoint.[https://www.tutorialspoint.com/csharp/csharp\_classes.htm](https://www.javatpoint.com/c-sharp-destructor)

**Destructor in Java :**

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

**Destructor in C :**

Nisha Kumari.( ม.ป.ป ).C Destructor: C Explained.bito.[https://bito.ai/resources/c-destructor-c-explained/](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](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/finalizers)
