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

พิสูจน์ว่า Static Class สร้าง Instance ได้เพียง 1 ตัวใน C#

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

คำอธิบาย

  1. Demo.Count++ ครั้งแรก → Trigger Static Constructor (Print "Static Constructor called")
  2. Count เพิ่มเป็น 2
  3. Demo.Count++ ครั้งที่ 2 และ 3 → Static Constructor ไม่รันซ้ำ
  4. พิสูจน์ว่า: 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 ClassSingleton Pattern
Instanceไม่มี (All Static)มี 1 Instance (Lazy/Eager)
Inheritanceไม่ได้ (Sealed)ได้ (ถ้าไม่ Sealed)
InterfaceImplement ไม่ได้Implement ได้
Dependency Injectionยากง่าย (Register Instance)
StateGlobal StateInstance State

ข้อควรระวัง

Static Class = Global State
- ยากต่อ Unit Testing (Mock ไม่ได้ง่าย)
- Thread Safety ต้องจัดการเอง (lock, Interlocked, ConcurrentDictionary)
- Hidden Dependencies (ทุกที่เข้าถึงได้)
- ใช้เฉพาะ Utility/Helper/Extension Methods ที่ Stateless