Static Keyword

Written By Kasidinthorn Phookang 650710525

ในภาษา C# คำว่า static ถูกใช้เพื่อกำหนดสมาชิกที่เป็นของประเภท (class) ไม่ใช่ของอินสแตนซ์ (instance) ของประเภทนั้น ซึ่งหมายความว่า สมาชิกที่ถูกประกาศเป็น static จะถูกแชร์ร่วมกันระหว่างทุก instance ของ class ไม่ใช่เป็นเอกลักษณ์เฉพาะสำหรับแต่ละ instance เมื่อสมาชิกถูกทำเครื่องหมายเป็น static สามารถเข้าถึงได้โดยไม่จำเป็นต้องสร้าง instance ของ class นั้น

1. Static Classes

ในภาษา C# คลาสสามารถถูกกำหนดว่าเป็น static ได้ ซึ่งหมายความว่าคลาสนั้นไม่สามารถสร้าง instance ได้ และสมาชิกทั้งหมดของมันต้องเป็น static และคลาส static ยังถูกปิด(sealed) จึงไม่สามารถใช้เป็น base class หรือมีสมาชิกที่เป็น instance ได้

using System;

static class MathUtilities
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

class Program
{
    static void Main(string[] args)
    {
        int result = MathUtilities.Add(5, 10);
        Console.WriteLine("Result: " + result);
    }
}

สรุปความแตกต่าง Static Class ใน 4 ภาษา

  • C# - มี static class คลาสทั้งคลาสต้องเป็น static

  • Java - ไม่มี static class แต่สามารถใช้ static methods และ static nested classes แทนกันได้

  • C++ - ไม่มี static class แต่สามารถใช้ static members แทน static class ได้

  • Python - ไม่มี static class แต่ใช้ @staticmethod เพื่อสร้างฟังก์ชันที่ทำงานแบบ static ได้

2. Static Variables

ในภาษา C# ตัวแปรที่ถูกประกาศด้วยการใช้คำว่า static เมื่อมีการประกาศตัวแปรเป็น static จะมีการสร้างสำเนาของตัวแปรเพียงชุดเดียวและถูกแชร์ร่วมกันระหว่างทุกๆ instance ในระดับคลาส (class level) ตัวแปร static สามารถเข้าถึงได้โดยใช้ชื่อคลาส ไม่จำเป็นต้องสร้าง instance เพื่อเข้าถึง

using System;

class MyClass
{
    public static int counter = 0;

    public MyClass()
    {
        counter++;
    }
}

class Program
{
    static void Main(string[] args)
    {
        new MyClass();
        new MyClass();
        new MyClass();

        Console.WriteLine("Counter: " + MyClass.counter);
    }
}

สรุปความแตกต่าง Static Variables ใน 4 ภาษา

  • C# - Static Variables ถูกใช้สำหรับการกำหนดค่าคงที่ (constants) เนื่องจากค่าสามารถเรียกใช้งานได้โดยการอ้างอิงถึงคลาสโดยตรงโดยไม่จำเป็นต้องสร้างอินสแตนซ์ของคลาสนั้น ตัวแปร static สามารถกำหนดค่าเริ่มต้นได้ทั้งภายนอกฟังก์ชันสมาชิก และสามารถกำหนดค่าเริ่มต้นภายในคลาสได้เช่นกัน

  • Java - เมื่อ Variables ถูกประกาศเป็น static จะมีการสร้างสำเนาเพียงชุดเดียวของตัวแปรนั้น และถูกแชร์ระหว่าง Objects ทั้งหมดในระดับคลาส โดยตัวแปร static นั้นเปรียบเสมือนตัวแปร global ซึ่ง instance ทั้งหมดของคลาสจะแชร์ตัวแปร static เดียวกัน

  • C - Static Variables มีคุณสมบัติในการคงค่าของตัวเองแม้ว่าจะอยู่นอก scope การใช้งานแล้วก็ตาม ดังนั้น ตัวแปร static จะคงค่าเดิมจาก scope เดิมไว้ และจะไม่ถูกกำหนดค่าใหม่เมื่อกลับเข้าสู่ scope ใหม่

  • Python - Static Variables ถูกกำหนดภายในคลาส แต่ถ้าอยู่นอกฟังก์ชันจะถูกกำหนดค่าเริ่มต้นเหมือนกับ instance variable แต่สามารถเข้าถึงและแก้ไขได้ผ่านคลาสโดยตรง ไม่จำเป็นต้องผ่าน instance ของคลาส

3. Static Methods

ในภาษา C# Methods ที่สามารถเรียกใช้งานได้โดยไม่ต้องสร้าง instance ของคลาส Methods เหล่านี้สามารถเข้าถึงได้เฉพาะสมาชิกที่เป็น static ของคลาสเท่านั้น และไม่สามารถเข้าถึงสมาชิกที่ไม่ใช่ static (สมาชิกของ instance) ได้โดยตรง

using System;

class MyClass
{
    public static void SayHello()
    {
        Console.WriteLine("Hello Static Method!");
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass.SayHello();
    }
}

สรุปความแตกต่าง Static Methods ใน 4 ภาษา

  • C# - คลาส static จะมีเฉพาะ Method แบบ static ดังนั้น static Method จะถูกประกาศโดยใช้คีย์เวิร์ด static Method เหล่านี้สามารถเข้าถึงได้เฉพาะตัวแปรข้อมูลแบบ static เท่านั้น และไม่สามารถเข้าถึงตัวแปรข้อมูลที่ไม่ใช่ static ได้

  • Java - Static method สามารถเข้าถึงได้เฉพาะข้อมูลที่เป็น static เท่านั้น ไม่สามารถเข้าถึงข้อมูลที่ไม่ใช่ static (instance variables) ได้ และ instance ทุกตัวของคลาสสามารถเข้าถึง static method ได้

  • C++ - จะใช้ Static Member Function แทน Static Methods สามารถเรียกได้แม้ว่าจะไม่มีวัตถุของคลาสอยู่ก็ตาม สามารถใช้ Static Member Function เพื่อกําหนดจํานวน object ของคลาสที่สร้างขึ้นได้

  • Python - Static method ในภาษา Python เป็น method ที่เป็นของคลาส ไม่ใช่ instance ของคลาสนั้น ไม่จำเป็นต้องใช้ instance ของคลาสในการเรียกใช้งาน และไม่สามารถเข้าถึง instance ได้ static method ใน Python ถูกประกาศได้โดยใช้ @staticmethod ซึ่งจะทำให้ Python รู้ว่าเมธอดนี้เป็น static และควรถูกเรียกใช้งานบนคลาส ไม่ใช่ instance ของคลาสนั้น

4. Static Constructor

ในภาษา C# Static constructor คือ คอนสตรัคเตอร์ที่ถูกเรียกโดยอัตโนมัติโดย runtime ก่อนที่สมาชิก static ใด ๆ ของคลาสจะถูกเข้าถึงหรือ Method static จะถูกเรียกใช้ มันถูกใช้สำหรับการทำงานของการตั้งค่าเริ่มต้น (initialization) ที่เฉพาะเจาะจงกับตัวประเภท (type) เอง ไม่ใช่กับ instance ใด ๆ ของประเภทนั้น

using System;

class MyClass
{
    public static int counter;

    // Static Constructor
    static MyClass()
    {
        counter = 10;
        Console.WriteLine("Static Constructor!");
    }

    public static void DisplayCounter()
    {
        Console.WriteLine("Counter: " + counter);
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass.DisplayCounter(); 
    }
}

สรุปความแตกต่าง Static Constructor ใน 4 ภาษา

  • C# - Static constructor ถูกใช้เพื่อกำหนดค่าเริ่มต้นให้กับตัวแปร static และสามารถใช้สำหรับการดำเนินการที่ต้องทำเพียงครั้งเดียวเท่านั้น นอกจากนี้ static constructor จะถูกเรียกใช้งานโดยอัตโนมัติก่อนที่จะมีการสร้าง instance หรือก่อนที่จะมีการอ้างอิงสมาชิก static ใดๆ

  • Java - ใน Java ไม่มี static constructors โดยตรง แต่จะใช้ Static block สำหรับการกำหนดค่าเริ่มต้นให้กับคลาสแบบ static โค้ดที่เขียนภายใน static block จะถูกเรียกใช้งานเพียงครั้งเดียวเมื่อคลาสนั้นถูกโหลดเข้าสู่หน่วยความจำ

  • C++ - ใน C++ ไม่มี static constructors โดยตรง แต่เราสามารถใช้ static variables ในฟังก์ชันแทนได้

  • Python - ใน Python ไม่มี static constructors แต่สามารถใช้ class initialization แทน static constructor ได้

Slides

References

-การใช้ static keyword ในภาษา C#

GeeksforGeeks. (2024, July 17). Static keyword in C#. GeeksforGeeks. https://www.geeksforgeeks.org/static-keyword-in-c-sharp/

-การใช้ Class และ static variables ในภาษา C#

Class and static variables in C#. (n.d.). https://www.tutorialspoint.com/class-and-static-variables-in-chash

-การใช้ static constructor ในภาษา C#

C# static constructor - javatpoint. (n.d.). www.javatpoint.com. https://www.javatpoint.com/c-sharp-static-constructor

-คุณสมบัติต่างๆของ static ในภาษา C#

Creator, F. S. C. (2023, May 19). Demystifying Static in C#: Understanding How it Works. Medium. https://medium.com/@javvadirupasri8/demystifying-static-in-c-understanding-how-it-works-d7b47a1acb32

-การใช้ static keyword ในภาษา java

Static keyword in Java - Javatpoint. (n.d.). www.javatpoint.com. https://www.javatpoint.com/static-keyword-in-java

-การใช้ static class ในภาษา java

GeeksforGeeks. (2023, November 9). Static class in Java. GeeksforGeeks. https://www.geeksforgeeks.org/static-class-in-java/

-การใช้ static method ในภาษา java

GeeksforGeeks. (2024b, August 21). Static method in Java with examples. GeeksforGeeks. https://www.geeksforgeeks.org/static-method-in-java-with-examples/

-การใช้ static variables ในภาษา C

GeeksforGeeks. (2024c, October 11). Static variables in C. GeeksforGeeks. https://www.geeksforgeeks.org/static-variables-in-c/

-การใช้ static constructor ในภาษา C++

What is a static constructor? (n.d.). Stack Overflow. https://stackoverflow.com/questions/5803953/what-is-a-static-constructor

-การใช้ static member function และ static method ในภาษา C++

GeeksforGeeks. (2022, December 20). Static Member Function in C++. GeeksforGeeks. https://www.geeksforgeeks.org/static-member-function-in-cpp/

-การใช้ Class or static variables ในภาษา Python

GeeksforGeeks. (2024c, September 30). Class or static variables in Python. GeeksforGeeks. https://www.geeksforgeeks.org/g-fact-34-class-or-static-variables-in-python/

-การใช้ static method ในภาษา Python

Python static method | DigitalOcean. (n.d.). https://www.digitalocean.com/community/tutorials/python-static-method

-การใช้ static constructor or static initializer ในภาษา Python

Is there a static constructor or static initializer in Python? (n.d.). Stack Overflow. https://stackoverflow.com/questions/7396092/is-there-a-static-constructor-or-static-initializer-in-python

Last updated