CodeBlanks Logo Icon CodeBlanks

Function pointer

C# kursu · Uzman · Ders 17/47

delegate* ile yönetilmeyen function pointer'ı öğrenirsin.

delegate* (function pointer)

C# 9'dan beri delegate* ile yönetilmeyen function pointer tanımlanır. delegate* unmanaged<int, int> C tarzı bir fonksiyon işaretçisidir; delegate'ten çok daha hızlıdır çünkü çalışma zamanı marshal yapmaz.

Yalnızca unsafe bağlamda kullanılır ve & ile alınır, () ile çağrılır. Bu, P/Invoke yerine yüksek performanslı callback'ler için tercih edilir.

delegate* çağrısı

Bir delegate*'i çağırmak için önce bir fonksiyon adresi gerekir: delegate* unmanaged<int, int> fp = &Function;. Daha sonra int r = fp(5); ile çağrılır.

Function işaretçileri unsafe blok içinde olmalıdır; AOT derleyicilerde delegate'ten çok daha verimlidir. Bu, oyun motorları ve ses işleme gibi senaryolarda tercih edilir.

Uygulama delegate* ile Square çağır

[UnmanagedCallersOnly] static int Square(int n) => n * n; metodunu tanımla. Main'i unsafe yap. delegate* unmanaged<int, int> fp = &Square; ile function pointer al. int r = fp(6); ile çağır ve Console.WriteLine(r); yaz.

Örnek çözümü göster
[UnmanagedCallersOnly] static int Square(int n) => n * n; yaz. unsafe Main'de delegate* unmanaged<int, int> fp = &Square; int r = fp(6); Console.WriteLine(r);
Örnek çözüm:
using System;
using System.Runtime.InteropServices;

class Program
{
    [UnmanagedCallersOnly]
    static int Square(int n) => n * n;

    static unsafe void Main()
    {
        delegate* unmanaged<int, int> fp = &Square;
        int r = fp(6);
        Console.WriteLine(r);
    }
}

Kendini test et

  1. delegate* neyi temsil eder?

    • Delegate sınıfı
    • Generic metot
    • Yönetilmeyen function pointer
    • Event handler
    Cevabı göster

    Yönetilmeyen function pointer — Doğru. delegate*, yönetilmeyen function pointer'dır.

  2. delegate* sözdizimini eşleştir

    delegate*
    Function pointer
    unmanaged
    Yönetilmeyen çağrı kuralı
    &Function
    Fonksiyon adresi
    fp(5)
    İşaretçi çağrısı
  3. delegate* bildirimi

    delegate* unmanaged<int, int> fp = ____Function;
    Cevabı göster
    delegate* unmanaged<int, int> fp = &Function;

Uzman bölümündeki tüm dersler