การส่ง Pointer เป็น Parameter ใน C# (Unsafe Code)
C# รองรับ Pointer ใน unsafe Context เท่านั้น ใช้สำหรับ Interop, Performance Critical, หรือ Low-level Memory Manipulation
ข้อกำหนด
- Project Properties → Build → Allow unsafe code ✓
- ใช้คีย์เวิร์ด
unsafeบน Method/Class/Block - Compile ด้วย
/unsafeflag
ตัวอย่าง: Swap ด้วย Pointer
using System;
class Program
{
// Unsafe Method
public unsafe void Swap(int* p, int* q)
{
int temp = *p;
*p = *q;
*q = temp;
}
public unsafe static void Main()
{
Program p = new Program();
int var1 = 10;
int var2 = 20;
// Address-of Operator (&)
int* x = &var1;
int* y = &var2;
Console.WriteLine($"Before Swap: var1={var1}, var2={var2}");
p.Swap(x, y);
Console.WriteLine($"After Swap: var1={var1}, var2={var2}");
Console.ReadKey();
}
}
ผลลัพธ์
Before Swap: var1=10, var2=20
After Swap: var1=20, var2=10
คำอธิบายโค้ด
int* p- Pointer to int (เก็บ Address)&var1- Address-of Operator (ได้ Address ของ var1)*p- Dereference Operator (เข้าถึงค่าที่ Address)unsafe- บอก Compiler ว่าบล็อกนี้ใช้ Pointer
Pointer Types
| Declaration | คำอธิบาย |
|---|---|
int* p | Pointer to int |
double* p | Pointer to double |
char* p | Pointer to char |
void* p | Generic Pointer (ไม่มี Type) |
Fixed Statement (Pinning)
ป้องกัน GC ย้าย Object ใน Memory ขณะใช้ Pointer
unsafe void Process(byte[] data)
{
fixed (byte* ptr = data) // Pin Array
{
// Use ptr here
} // Unpin Auto
}
⚠️ คำเตือน
- Unsafe Code ข้าม Type Safety และ Memory Safety ของ .NET
- ใช้เฉพาะเมื่อจำเป็นจริง (Interop, Graphics, High-perf Math)
- แนะนำให้ใช้
Span<T>,Memory<T>(Safe, Fast, Modern) แทน