Static Method (Static Member Function)
- ประกาศด้วยคีย์เวิร์ด
static
- เข้าถึงได้เฉพาะ Static Members เท่านั้น (Static Fields, Static Properties, Static Methods)
- มีอยู่ก่อนที่จะสร้าง Object (Instance) - เป็นของ Class ไม่ใช่ของ Object
- เรียกใช้ผ่าน Class Name โดยตรง
Non-Static Method (Instance Method)
- ไม่มีคีย์เวิร์ด
static
- เข้าถึงได้ทั้ง Instance Members และ Static Members
- ต้องสร้าง Object (Instance) ก่อนจึงจะเรียกใช้ได้
- มี
this Reference ชี้ไปที่ Instance ปัจจุบัน
ตารางเปรียบเทียบ
| คุณสมบัติ |
Static Method |
Non-Static (Instance) Method |
| คีย์เวิร์ด |
static |
(ไม่มี) |
| การเรียกใช้ |
ClassName.Method() |
instance.Method() |
| เข้าถึง Instance Members |
❌ ไม่ได้ (Compile Error) |
✅ ได้ (ผ่าน this) |
| เข้าถึง Static Members |
✅ ได้ |
✅ ได้ |
| มี this Reference |
❌ ไม่มี |
✅ มี |
| Virtual/Override |
❌ ไม่ได้ |
✅ ได้ |
| Interface Implementation |
❌ ไม่ได้ (C# 8.0+ ได้ Static Interface Methods) |
✅ ได้ |
| หน่วยความจำ |
หนึ่งเดียวสำหรับทั้งโปรแกรม |
ต่อ Instance (แต่ Code Segment ร่วมกัน) |
ตัวอย่างโค้ดเปรียบเทียบ
using System;
namespace StaticVsInstance {
public class Calculator {
// Static Field - ร่วมกันทุก Instance
public static int CalculationCount = 0;
// Instance Field - แต่ละ Instance แยกกัน
public int InstanceCount = 0;
// Static Method - เรียกผ่าน Class Name
public static int StaticAdd(int a, int b) {
CalculationCount++; // เข้าถึง Static Field ได้
// InstanceCount++; // ❌ Error! ไม่เข้าถึง Instance Field ได้
return a + b;
}
// Instance Method - เรียกผ่าน Object
public int InstanceAdd(int a, int b) {
InstanceCount++; // เข้าถึง Instance Field ได้
CalculationCount++; // เข้าถึง Static Field ได้
return a + b;
}
public static int GetStaticCount() => CalculationCount;
public int GetInstanceCount() => InstanceCount;
}
class Program {
static void Main(string[] args) {
// เรียก Static Method - ไม่ต้อง new
int result1 = Calculator.StaticAdd(10, 20);
int result2 = Calculator.StaticAdd(5, 15);
Console.WriteLine($"Static Add: {result1}, {result2}");
Console.WriteLine($"Static Count: {Calculator.GetStaticCount()}"); // 2
// เรียก Instance Method - ต้อง new
Calculator calc1 = new Calculator();
Calculator calc2 = new Calculator();
calc1.InstanceAdd(1, 2);
calc1.InstanceAdd(3, 4);
calc2.InstanceAdd(10, 20);
Console.WriteLine($"Calc1 Instance Count: {calc1.GetInstanceCount()}"); // 2
Console.WriteLine($"Calc2 Instance Count: {calc2.GetInstanceCount()}"); // 1
Console.WriteLine($"Total Static Count: {Calculator.GetStaticCount()}"); // 5
Console.ReadKey();
}
}
}
ผลลัพธ์
Static Add: 30, 20
Static Count: 2
Calc1 Instance Count: 2
Calc2 Instance Count: 1
Total Static Count: 5
Static Class vs Non-Static Class
// Static Class - มีแค่ Static Members, ไม่ new ได้
public static class MathUtils {
public static double PI = 3.14159;
public static double CircleArea(double r) => PI * r * r;
}
// Non-Static Class - มี Instance และ Static ได้
public class Calculator {
public static int GlobalCount = 0; // Static Member
public int LocalCount = 0; // Instance Member
public static void StaticMethod() { }
public void InstanceMethod() { }
}
เมื่อไหร่ควรใช้ Static Method?
- Utility Functions (Math, String Helpers, Conversion)
- Factory Methods (
CreateInstance())
- Extension Methods
- Stateless Operations (ไม่ขึ้นกับ Instance State)
- Performance Critical (เล็กน้อย - ไม่มี this overhead)
เมื่อไหร่ควรใช้ Instance Method?
- ต้องการเข้าถึง Instance Data (Fields/Properties)
- ต้องการ Polymorphism (Virtual/Override)
- Implement Interface
- Object มี Identity และ State ของตัวเอง
⚠️ ข้อผิดพลาดที่พบบ่อย
public class BadExample {
public int Value = 10;
public static void PrintValue() {
Console.WriteLine(Value); // ❌ CS0120: An object reference is required for non-static field
}
}
// ✅ แก้ไข: ทำ Method เป็น Instance Method
public void PrintValue() {
Console.WriteLine(Value); // OK
}
// หรือ ทำ Field เป็น Static
public static int Value = 10;
public static void PrintValue() {
Console.WriteLine(Value); // OK
}