คำตอบสั้น: เพียง 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 ต่อ Class | 1 ตัว (Max) |
| Syntax | ~ClassName() |
| การเรียก | โดย GC เท่านั้น (Non-deterministic) |
| Struct | ไม่สามารถมีได้ |
| แนะนำใช้แทน | IDisposable + Dispose Pattern |