> For the complete documentation index, see [llms.txt](https://www.saladpuk.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.saladpuk.com/beginner-1/csharp101/tips/boxing-and-unboxing.md).

# Boxing & Unboxing

{% hint style="success" %}
ความรู้เรื่องนี้เป็นความรู้ประดับ ไม่รู้ก็ทำงานได้ไม่มีปัญหาอะไร แต่ถ้ารู้จะทำให้ performance ของโค้ดเราดีขึ้น ละเข้าใกล้ Production Code มาขึ้นครัช
{% endhint %}

## Boxing

ปรกติตัวแปรที่มี Data type เป็น object นั้นจะสามารถเก็บทุกสิ่งทุกอย่างใน C# ได้ เพราะมันคือต้นตระกูลนั่นเอง เช่น ถ้าเราอยากเก็บค่าตัวเลขไว้ใน object เราก็เขียนแบบนี้ก็ได้

```csharp
int i = 123;
object o = i;     // boxing
```

ซึ่งจากโค้ดด้านบน การทำงานจริงๆของมันคือ มันจะไปสร้าง object ใหม่ให้กับตัวแปร o แล้วมันจะ **Copy** ค่าตัวแปร i ไปเก็บไว้ใน heap แล้วค่อยให้ตัวแปร o ชี้ไปหาตัวแปรที่ copy ขึ้นมาต่ออีกที

![](https://479516123-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lm0_idNbY6k1lwp6hm4%2F-M1lfqlFTvI3gmheTI_q%2F-LpwGYXwGZtNujZv4oY7%2Fimage.png?generation=1583529150633037\&alt=media)

จากที่ร่ายมากระบวนการนี้เราเรียกมันว่าการทำ **Boxing** นั่นเอง ซึ่งเกิดขึ้นภายในบรรทัดที่ 2

## Unboxing

คราวนี้ตัวแปรที่เราเก็บไว้ใน object เมื่อเราต้องการเอาออกมาใช้งาน ให้กลับมาอยู่ใน Data type ปรกติของมัน เราก็จะต้องทำการ cast มันกลับไปนั่นเองตามโค้ดด้านล่าง

```csharp
int i = 123;      // a value type
object o = i;     // boxing
int j = (int)o;   // unboxing
```

จากโค้ดด้านบน บรรทัดที่ 3 โปรแกรมจะต้องไปเอาค่าที่เก็บในตัวแปร o ออกมา แล้วแปลง data type ให้กลับคืนมาเป็น int นั่นเอง

![](https://479516123-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lm0_idNbY6k1lwp6hm4%2F-M1lfqlFTvI3gmheTI_q%2F-M-ZQjrLHDndvzGxZBF5%2Fimage.png?generation=1583529178611085\&alt=media)

ซึ่งกระบวนการทำ Unboxing นี้อาจจะเกิด error ขึ้นได้ ถ้าข้อมูลที่เก็บอยู่มันไม่สามารถ cast กลับออกมาได้นั่นเอง
