Managed Code (โค้ดที่ถูกจัดการ) ใน C#
Managed Code คือโค้ดที่การทำงานถูกจัดการโดย Common Language Runtime (CLR) ของ .NET Framework/.NET Core/.NET 5+ แทนที่จะรันบนระบบปฏิบัติการโดยตรง
ลักษณะสำคัญของ Managed Code
| คุณสมบัติ | คำอธิบาย |
|---|---|
| Memory Management | Garbage Collector (GC) จัดการหน่วยความจำอัตโนมัติ |
| Type Safety | ตรวจสอบชนิดข้อมูลระหว่างรันไทม์ ป้องกัน buffer overflow |
| Exception Handling | โครงสร้าง try/catch/finally ที่แข็งแกร่ง |
| Security | Code Access Security (CAS) ควบคุมสิทธิ์การทำงาน |
| Interoperability | ทำงานร่วมกับภาษา .NET อื่นๆ ได้ง่าย (C#, F#, VB.NET) |
กระบวนการทำงาน
Source Code (C#)
↓ Compiler (csc / Roslyn)
Intermediate Language (IL / MSIL / CIL) -- ไฟล์ .exe หรือ .dll
↓ JIT Compiler (Just-In-Time) ระหว่างรัน
Native Machine Code (x86, x64, ARM)
↓ Execute on CLR
Program Running
Managed vs Unmanaged Code
| ด้าน | Managed Code (C#, VB.NET, F#) | Unmanaged Code (C, C++) |
|---|---|---|
| การคอมไพล์ | IL → JIT → Native | Native Machine Code โดยตรง |
| Memory | GC จัดการอัตโนมัติ | Programmer จัดการเอง (malloc/free, new/delete) |
| Pointers | จำกัด (unsafe context เท่านั้น) | ใช้ได้เต็มที่ |
| Exception | Structured (try/catch/finally) | ไม่มีมาตรฐาน (SEH บน Windows) |
| Performance | ช้ากว่าเล็กน้อย (JIT, GC) | เร็วสุด ควบคุมได้ทุกอย่าง |
Unsafe Context ใน C#
C# อนุญาตให้ใช้โค้ด unmanaged ได้ในบล็อก unsafe:
unsafe
{
int var = 100;
int* p = &var; // pointer
Console.WriteLine(*p); // 100
}
// ต้อง compile ด้วย flag /unsafe
Platform Invoke (P/Invoke)
เรียกใช้ unmanaged code (DLL, Win32 API) จาก managed code:
using System.Runtime.InteropServices;
class NativeMethods
{
[DllImport("user32.dll")]
public static extern bool MessageBox(IntPtr hWnd, string text, string caption, uint type);
}
// ใช้งาน
NativeMethods.MessageBox(IntPtr.Zero, "Hello from C++!", "P/Invoke", 0);
ข้อดีของ Managed Code
- ลดบั๊ก memory leak, dangling pointer, buffer overflow
- พัฒนาเร็วขึ้น ไม่ต้องจัดการหน่วยความจำเอง
- Debugging ง่ายกว่า (stack trace ชัดเจน)
- Cross-platform ได้ง่าย (NET Core/5+)
- Security model ที่ทันสมัย
เมื่อไหร่ต้องใช้ Unmanaged
- ประสิทธิภาพสำคัญมาก (High-frequency trading, Game engine core)
- ต้องควบคุม Hardware โดยตรง (Device drivers, OS kernel)
- Interop กับ legacy C/C++ libraries
- Real-time systems ที่ต้องการ deterministic timing