---
description: สุชัญญา คดดี 650710097
---

# Boxing and Unboxing

## Boxing คืออะไร

**Boxing**  คือกระบวนการแปลงตัวแปรชนิด **value type** (เช่น char, int) ไปเป็นตัวแปรชนิด **reference type** (เช่น object)

* **การสร้างวัตถุใหม่:** ในการBoxing คอมไพเลอร์จะสร้างวัตถุใหม่ขึ้นมาบน heap เพื่อเก็บค่าของ value type นั้น

## หลักการทำงานของ Boxing

<figure><img src="https://2358863655-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPtNVavcFSOLzLOmmCgv%2Fuploads%2F0PDLDFlr5UmFCp7iTVmE%2FBoxing.jpg?alt=media&#x26;token=18577f9c-91d2-4a7c-94de-7026ebb3bbba" alt=""><figcaption></figcaption></figure>

* ก่อนการBoxingนั้น ค่าของValue typeเช่น int, float, char จะถูกจัดเก็บใน Stack ในขณะที่Reference typeเช่น object จะถูกจัดเก็บใน Heap memory



ตัวอย่างการใช้งาน และเปรียบเทียบกับภาษาอื่น

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

class Program
{
    static void Main()
    {
        int originalValue = 23;
        object boxedValue = originalValue;
    }
}
```
{% endtab %}

{% tab title="Java" %}
```java
import java.util.*.;

public class BoxingExample {
    public static void main(String[] args) {
        int primitiveValue = 23;
        Integer boxedValue = primitiveValue; //Boxing
    }
}
```
{% endtab %}

{% tab title="Python" %}
<pre class="language-python"><code class="lang-python">number = 23
<strong>#numberเป็นobject integer
</strong></code></pre>
{% endtab %}
{% endtabs %}

## การAuto Boxing

**Autoboxing** เป็นการทำให้เกิดการ Boxing โดยอัตโนมัติในบางกรณี โดยเฉพาะชนิดข้อมูลที่ต้องการใช้ประเภทข้อมูลที่เป็นReference Type เช่น `ArrayList` ซึ่งสามารถเก็บประเภทข้อมูลValue Typeได้

## ตัวอย่างการAutoboxing

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

class Program
{
    static void Main()
    {
        List<object> list = new List<object>();

        list.Add(42);
    }
}
```
{% endtab %}
{% endtabs %}



## Unboxing คืออะไร

Unboxing หมายถึงการแปลงค่าแบบ Boxing กลับไปยังประเภทValue Typeจากประเภทข้อมูลที่เป็นReference Type

**การแปลงนี้ต้องทำอย่างชัดเจน:** หมายความว่าโปรแกรมเมอร์ต้องระบุอย่างชัดเจนว่าต้องการแปลงข้อมูลจากชนิดหนึ่งไปอีกชนิดหนึ่ง

## หลักการทำงานของ Unboxing

<figure><img src="https://2358863655-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPtNVavcFSOLzLOmmCgv%2Fuploads%2Fpb4mBrfrFUZNS8eV2wy2%2FUnboxing.jpg?alt=media&#x26;token=5811fb8c-0115-48bd-9139-f9306f313ca8" alt=""><figcaption></figcaption></figure>

* การ Unboxing จะนำกระบวนการ Boxing ที่เป็น Reference Type มาแปลงค่ากลับเป็น Value Type

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

class Program
{
    static void Main()
    {
        // Boxing
        int num = 23;
        object boxedNum = num;

        // Unboxing
        int unboxedNum = (int)boxedNum; 

        Console.WriteLine($"Original Number: {num}");
        Console.WriteLine($"Boxed Number: {boxedNum}");
        Console.WriteLine($"Unboxed Number: {unboxedNum}");
    }
}

```
{% endtab %}
{% endtabs %}

ตัวอย่างการใช้งาน และเปรียบเทียบกับภาษาอื่น

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

class Program
{
    static void Main()
    {
        int originalValue = 23;
        object boxedValue = originalValue;
        int unboxedValue = (int)boxedValue;
    }
}
```
{% endtab %}

{% tab title="Java" %}
```java
import java.util.ArrayList;

public class BoxingExample {
    public static void main(String[] args) {
        int primitiveValue = 23;
        Integer boxedValue = primitiveValue;

        ArrayList<Integer> list = new ArrayList<>();
        list.add(boxedValue);

        int unboxedValue = list.get(0); //Unboxing
        System.out.println("Unboxed Value: " + unboxedValue);
    }
}
```
{% endtab %}

{% tab title="Python" %}
```python
def get_coordinates():
    return (10, 20)
x, y = get_coordinates()

print(f"x: {x}, y: {y}")
```
{% endtab %}
{% endtabs %}

## Slide & Presentation Video

Video Presentation

{% embed url="https://youtu.be/Ctc5QuiYYco" %}

Slide Presentation

{% file src="https://2358863655-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFPtNVavcFSOLzLOmmCgv%2Fuploads%2F26Egb27KK77mQYro7x5X%2FBoxing%20and%20Unboxing.pdf?alt=media&token=8f88bfe8-9708-4303-bf9a-4b81b5dfd00d" %}

## แหล่งอ้างอิง(Reference)

GeeksforGeeks. (n.d.). Boxing and Unboxing in C#. Retrieved from

{% embed url="https://www.geeksforgeeks.org/c-sharp-boxing-unboxing/" %}

Microsoft Docs. (n.d.). Boxing and Unboxing. Retrieved from

{% embed url="https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/types/boxing-and-unboxing" %}

JavaTpoint. (n.d.). Autoboxing and Unboxing in Java. Retrieved from

{% embed url="https://www.javatpoint.com/autoboxing-and-unboxing" %}

SaladPuk. (n.d.). C# 101: Tips on Boxing and Unboxing. Retrieved from

{% embed url="https://www.saladpuk.com/beginner-1/csharp101/tips/boxing-and-unboxing" %}
