Static Class ใน C#
- ไม่สามารถ
newสร้าง Instance ได้ - Member ทั้งหมดต้องเป็น Static
- Sealed และ Abstract โดยปริยาย (Cannot Inherit, Cannot Instantiate)
- Constructor: มีได้แค่ Static Constructor (Parameterless, ไม่มี Access Modifier)
การพิสูจน์: Static Constructor เรียกเพียงครั้งเดียว
using System;
static class Demo
{
public static int Count = 0;
// Static Constructor - เรียกครั้งเดียว ก่อน First Access
static Demo()
{
Console.WriteLine("Static Constructor called");
}
}
class Program
{
static void Main()
{
// เข้าถึง Static Member ครั้งแรก → Static Constructor รัน
Demo.Count++;
Demo.Count++;
Console.WriteLine($"Count = {Demo.Count}"); // 2
// เข้าถึงอีกครั้ง → Static Constructor ไม่รันซ้ำ
Demo.Count++;
Console.WriteLine($"Count = {Demo.Count}"); // 3
Console.ReadKey();
}
}
Output
Static Constructor called Count = 2 Count = 3
คำอธิบาย
Demo.Count++ครั้งแรก → Trigger Static Constructor (Print "Static Constructor called")- Count เพิ่มเป็น 2
Demo.Count++ครั้งที่ 2 และ 3 → Static Constructor ไม่รันซ้ำ- พิสูจน์ว่า: Static Class มี "Instance" (Internal State) เพียง 1 ตัวเท่านั้น ทั้ง AppDomain
Static Constructor Characteristics
- รัน ก่อน Instance แรกถูกสร้าง หรือ Static Member แรกถูก Access
- รัน ครั้งเดียว ต่อ AppDomain (Thread-Safe)
- ไม่มี Parameter, ไม่มี Access Modifier
- ไม่สามารถเรียกโดยตรงได้
- Exception ใน Static Constructor → Type ไม่usable (TypeInitializationException)
Static Class vs Singleton
| คุณสมบัติ | Static Class | Singleton Pattern |
|---|---|---|
| Instance | ไม่มี (All Static) | มี 1 Instance (Lazy/Eager) |
| Inheritance | ไม่ได้ (Sealed) | ได้ (ถ้าไม่ Sealed) |
| Interface | Implement ไม่ได้ | Implement ได้ |
| Dependency Injection | ยาก | ง่าย (Register Instance) |
| State | Global State | Instance State |
ข้อควรระวัง
Static Class = Global State
- ยากต่อ Unit Testing (Mock ไม่ได้ง่าย)
- Thread Safety ต้องจัดการเอง (lock, Interlocked, ConcurrentDictionary)
- Hidden Dependencies (ทุกที่เข้าถึงได้)
- ใช้เฉพาะ Utility/Helper/Extension Methods ที่ Stateless
- ยากต่อ Unit Testing (Mock ไม่ได้ง่าย)
- Thread Safety ต้องจัดการเอง (lock, Interlocked, ConcurrentDictionary)
- Hidden Dependencies (ทุกที่เข้าถึงได้)
- ใช้เฉพาะ Utility/Helper/Extension Methods ที่ Stateless