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

Destructor ใน C# มีได้กี่ตัวใน Class เดียว

คำตอบสั้น: เพียง 1 ตัวเท่านั้น

ใน C# Class หนึ่งสามารถมี Destructor (Finalizer) ได้ สูงสุด 1 ตัว หากประกาศมากกว่า 1 จะเกิด Compile Error

คุณสมบัติของ Destructor

  • ชื่อเดียวกับ Class ขึ้นต้นด้วย ~ (Tilde)
  • ไม่มี Parameter, ไม่มี Access Modifier, ไม่มี Return Type
  • ไม่สามารถ Overload ได้
  • ไม่สามารถเรียกโดยตรงได้ (Called by GC)
  • Struct ไม่สามารถมี Destructor ได้
  • Implicitly เรียก base.Finalize() ใน finally block

Syntax


class Demo
{
    // Destructor / Finalizer - มีได้เพียง 1 ตัว
    ~Demo()
    {
        // Cleanup unmanaged resources
        Console.WriteLine("Finalizer called");
    }
}

Compile Error ถ้าประกาศ 2 ตัว


class Demo
{
    ~Demo() { }  // First
    ~Demo() { }  // ❌ Error CS0111: 'Demo' already defines a member called '~Demo'
}

Finalizer จริงๆ คืออะไร (Compiler Translation)

C# Destructor ถูกแปลงเป็น protected override void Finalize():


protected override void Finalize()
{
    try
    {
        // Cleanup statements from ~Demo()
    }
    finally
    {
        base.Finalize(); // เรียก Base Finalizer เสมอ
    }
}

Dispose Pattern (แนะนำแทน Destructor)

Destructor ไม่ Deterministic (ไม่รู้ว่าเมื่อไหร่จะรัน) แนะนำใช้ IDisposable แทน:


public class ResourceHolder : IDisposable
{
    private bool _disposed = false;
    
    // Public Dispose - เรียกได้ทันที
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this); // ป้องกัน Finalizer รันซ้ำ
    }
    
    // Protected Virtual - ให้ Derived Override
    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                // Managed Resources
            }
            // Unmanaged Resources
            _disposed = true;
        }
    }
    
    // Finalizer - Safety Net เท่านั้น
    ~ResourceHolder()
    {
        Dispose(false);
    }
}

สรุป

หัวข้อรายละเอียด
จำนวน Destructor ต่อ Class1 ตัว (Max)
Syntax~ClassName()
การเรียกโดย GC เท่านั้น (Non-deterministic)
Structไม่สามารถมีได้
แนะนำใช้แทนIDisposable + Dispose Pattern