Non-Static Class (คลาสทั่วไป / Instance Class)
คลาสที่สามารถสร้าง Instance (Object) ได้หลายตัว โดยใช้คีย์เวิร์ด new แต่ละ Instance จะมีสำเนาของ Instance Members (Fields, Properties, Methods) ของตัวเอง
Static Class (คลาสสแตติก)
คลาสที่ ไม่สามารถสร้าง Instance ได้ มีเพียง Static Members เท่านั้น เข้าถึงผ่านชื่อคลาสโดยตรง
ตารางเปรียบเทียบ
| คุณสมบัติ | Non-Static Class | Static Class |
|---|---|---|
| Instantiation (สร้าง Instance) | ได้ (new MyClass()) |
ไม่ได้ (Compile Error) |
| Instance Members | มีได้ (Fields, Properties, Methods) | ไม่มี (Error) |
| Static Members | มีได้ | มีได้ (บังคับต้องเป็น Static ทั้งหมด) |
| Constructor | Instance Constructor + Static Constructor | มีได้แค่ Static Constructor |
| Inheritance | สืบทอดได้ (ถ้าไม่ sealed) | ไม่ได้ (Implicit Sealed) |
| Interface Implementation | Implement ได้ | ไม่ได้ |
| การเข้าถึง | ผ่าน Instance (obj.Method()) |
ผ่าน Class Name (MyClass.Method()) |
ตัวอย่าง Non-Static Class
public class Calculator {
// Instance Field - แต่ละ Object มีค่าแยกกัน
private int _memory = 0;
// Instance Method
public int Add(int a, int b) {
int result = a + b;
_memory = result; // เก็บค่าล่าสุด
return result;
}
public int GetMemory() {
return _memory;
}
// Static Method - ใช้ร่วมกันทุก Instance
public static int StaticAdd(int a, int b) {
return a + b;
}
}
// การใช้งาน
Calculator calc1 = new Calculator();
Calculator calc2 = new Calculator();
calc1.Add(10, 5); // calc1._memory = 15
calc2.Add(20, 30); // calc2._memory = 50
Console.WriteLine(calc1.GetMemory()); // 15
Console.WriteLine(calc2.GetMemory()); // 50
// เรียก Static Method ผ่าน Class Name
int sum = Calculator.StaticAdd(5, 3); // 8
ตัวอย่าง Static Class
public static class MathUtils {
// ทุก Member ต้องเป็น Static
public const double PI = 3.14159;
public static double CircleArea(double radius) {
return PI * radius * radius;
}
public static double CircleCircumference(double radius) {
return 2 * PI * radius;
}
// Static Constructor - เรียกครั้งเดียวก่อนใช้งานครั้งแรก
static MathUtils() {
Console.WriteLine("MathUtils initialized");
}
}
// การใช้งาน - ไม่ต้อง new
double area = MathUtils.CircleArea(5); // 78.53975
// MathUtils m = new MathUtils(); // Compile Error!
เมื่อไหร่ควรใช้ Static Class?
- กลุ่ม Utility Functions ที่ไม่มี State (Stateless)
- Extension Methods
- Constants และ Configuration
- Singleton Pattern (บางกรณี)
เมื่อไหร่ควรใช้ Non-Static Class?
- ต้องการ State (ข้อมูลที่แต่ละ Instance แตกต่างกัน)
- ต้องการ Polymorphism (Inheritance, Interface)
- ต้องการสร้างหลาย Instance
- Domain Objects (Entity, Model, DTO)