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

Static Method เทียบ Non-Static Method ใน C#

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
}