Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

ส่ง Pointer เป็น Parameter ใน C#

การส่ง Pointer เป็น Parameter ใน C# (Unsafe Code)

C# รองรับ Pointer ใน unsafe Context เท่านั้น ใช้สำหรับ Interop, Performance Critical, หรือ Low-level Memory Manipulation

ข้อกำหนด

  1. Project Properties → Build → Allow unsafe code ✓
  2. ใช้คีย์เวิร์ด unsafe บน Method/Class/Block
  3. Compile ด้วย /unsafe flag

ตัวอย่าง: 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* pPointer to int
double* pPointer to double
char* pPointer to char
void* pGeneric 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) แทน