---
description: Written By Kasidinthorn Phookang 650710525
---

# Static Keyword

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

### 1. Static Classes

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

{% tabs %}
{% tab title="C#" %}
```csharp
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);
    }
}
```
{% endtab %}

{% tab title="Java" %}
```java
class MathUtilities {
    public static int add(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        int result = MathUtilities.add(5, 10);
        System.out.println("Result: " + result);
    }
}
```
{% endtab %}

{% tab title="C++" %}
```cpp
#include <iostream>

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

int main() {
    int result = MathUtilities::add(5, 10);
    std::cout << "Result: " << result << std::endl;
    return 0;
}
```
{% endtab %}

{% tab title="Python" %}
```python
class MathUtilities:
    @staticmethod
    def add(a, b):
        return a + b

result = MathUtilities.add(5, 10)
print("Result:", result)
```
{% endtab %}

{% tab title="Output" %}
```
Result: 15
```
{% endtab %}
{% endtabs %}

สรุปความแตกต่าง **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 เพื่อเข้าถึง

{% tabs %}
{% tab title="C#" %}
```csharp
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);
    }
}

```
{% endtab %}

{% tab title="Java" %}
```java
class MyClass {
    public static int counter = 0;

    public MyClass() {
        counter++;
    }
}

public class Main {
    public static void main(String[] args) {
        new MyClass();
        new MyClass();
        new MyClass();

        System.out.println("Counter: " + MyClass.counter);  
    }
}

```
{% endtab %}

{% tab title="C" %}
```c
#include <stdio.h>

void incrementCounter() {
    static int counter = 0;  
    counter++;
    if (counter == 3) {
        printf("Counter: %d\n", counter);
    }
}

int main() {
    incrementCounter();  
    incrementCounter();  
    incrementCounter();  
    return 0;
}

```
{% endtab %}

{% tab title="Python" %}
```python
class MyClass:
    counter = 0  # Class variable (equivalent to static variable)

    def __init__(self):
        MyClass.counter += 1

obj1 = MyClass()
obj2 = MyClass()
obj3 = MyClass()

print("Counter:", MyClass.counter)  

```
{% endtab %}

{% tab title="Output" %}
```
Counter: 3
```
{% endtab %}
{% endtabs %}

สรุปความแตกต่าง **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) ได้โดยตรง

{% tabs %}
{% tab title="C#" %}
```csharp
using System;

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

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

{% tab title="Java" %}
```java
class MyClass {
    public static void sayHello() {
        System.out.println("Hello Static Method!");
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass.sayHello();  
    }
}
```
{% endtab %}

{% tab title="C++" %}
```cpp
#include <iostream>

class MyClass {
public:
    static void sayHello() {
        std::cout << "Hello Static Method!" << std::endl;
    }
};

int main() {
    MyClass::sayHello(); 
    return 0;
}

```
{% endtab %}

{% tab title="Python" %}
```python
class MyClass:
    @staticmethod
    def say_hello():
        print("Hello Static Method!")

MyClass.say_hello()  

```
{% endtab %}

{% tab title="Output" %}
```
Hello Static Method!
```
{% endtab %}
{% endtabs %}

สรุปความแตกต่าง **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 ใด ๆ ของประเภทนั้น

{% tabs %}
{% tab title="C#" %}
```csharp
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(); 
    }
}

```
{% endtab %}

{% tab title="Java" %}
```java
class MyClass {
    public static int counter;

    // Static block
    static {
        counter = 10;
        System.out.println("Static Constructor!");
    }

    public static void displayCounter() {
        System.out.println("Counter: " + counter);
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass.displayCounter();  
    }
}

```
{% endtab %}

{% tab title="C++" %}
```cpp
#include <iostream>

class MyClass {
public:
    static int counter;

    // Static function to initialize static variables
    static void initialize() {
        static bool initialized = false;
        if (!initialized) {
            counter = 10;
            std::cout << "Static Constructor!" << std::endl;
            initialized = true;
        }
    }

    static void displayCounter() {
        std::cout << "Counter: " << counter << std::endl;
    }
};

int MyClass::counter = 0;

int main() {
    MyClass::initialize();
    MyClass::displayCounter();  
    return 0;
}

```
{% endtab %}

{% tab title="Python" %}
```python
class MyClass:
    counter = 0

    @classmethod
    def initialize(cls):
        if cls.counter == 0:
            cls.counter = 10
            print("Static Constructor!")

    @staticmethod
    def display_counter():
        print("Counter:", MyClass.counter)

# เรียกใช้ฟังก์ชัน initialize เพื่อจำลอง static constructor
MyClass.initialize()
MyClass.display_counter() 

```
{% endtab %}

{% tab title="Output" %}
```
Static Constructor!
Counter: 10
```
{% endtab %}
{% endtabs %}

สรุปความแตกต่าง **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 ได้

## **Link Video** Presentation

{% embed url="https://www.youtube.com/watch?v=VjQwoG8C4Js" %}

## **Slides**

{% file src="https://2358863655-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPtNVavcFSOLzLOmmCgv%2Fuploads%2FDv8kFts9J8zVzNdo1RP0%2F650710525_Static_Keyword.pdf?alt=media&token=6f41f21e-78a6-4b7d-8011-cd9d00e88961" %}

## **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#&#x20;

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

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

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
