CodeBlanks Logo Icon CodeBlanks

Özet - Unsafe kod

C# kursu · Uzman · Ders 12/47

unsafe, fixed ve Span<T>'yi birleştirerek hızlı bir arabellek kopyalama yazarsın.

Özet - Unsafe kod

Bu grupta unsafe blokları, işaretçileri (int*), fixed ile sabitlemeyi, stackalloc ile yığın tahsisini ve Span<T>'yi öğrendin.

Bu araçlar performansın kritik olduğu yerlerde kullanılır; günlük koda Span çoğu zaman unsafe'in yerini alır. Şimdi küçük bir arabellek kopyalama ve sabitleme örneği yazalım.

Uygulama Span ile arabellek kopyala

Span<int> src = stackalloc int[3]; ile 3 int ayır. src[0] = 1; src[1] = 2; src[2] = 3; ata. Span<int> dst = stackalloc int[3]; ile hedef ayır. src.CopyTo(dst); ile kopyala, Console.WriteLine(dst[2]); ile son elemanı yazdır.

Örnek çözümü göster
Span<int> src = stackalloc int[3]; src[0] = 1; src[1] = 2; src[2] = 3; Span<int> dst = stackalloc int[3]; src.CopyTo(dst); Console.WriteLine(dst[2]);
Örnek çözüm:
using System;

class Program
{
    static void Main()
    {
        Span<int> src = stackalloc int[3];
        src[0] = 1; src[1] = 2; src[2] = 3;
        Span<int> dst = stackalloc int[3];
        src.CopyTo(dst);
        Console.WriteLine(dst[2]);
    }
}

unsafe ve Span birlikte

unsafe hâlâ gerektiğinde fixed ile Span'den işaretçi alınabilir: fixed (int* p = &span[0]). Yani Span güvenli taraf, unsafe esnek taraf.

Doğru tasarım: önce Span dene, yetersizse unsafe'e geç. Bu, çoğu yüksek performanslı senaryoyu güvenli biçimde çözer ve hata riskini düşürür.

Uygulama fixed ile ikinci elemanı yazdır

Main'i unsafe yap. int[] arr = { 7, 14 }; tanımla. fixed (int* p = &arr[0]) bloğu içinde Console.WriteLine(*(p + 1)); ile ikinci elemanı yazdır.

Örnek çözümü göster
unsafe static void Main() { int[] arr = {7,14}; fixed (int* p = &arr[0]) { Console.WriteLine(*(p + 1)); } }
Örnek çözüm:
using System;

class Program
{
    unsafe static void Main()
    {
        int[] arr = { 7, 14 };
        fixed (int* p = &arr[0])
        {
            Console.WriteLine(*(p + 1));
        }
    }
}

Kendini test et

  1. Hangisi unsafe gerektirmeden yığın tahsisi sağlar?

    • new int[4]
    • stackalloc int[4] (Span ile)
    • GC.Allocate
    • fixed int[4]
    Cevabı göster

    stackalloc int[4] (Span ile) — Doğru. Span'a atanan stackalloc unsafe gerektirmez.

  2. Kavramları eşleştir

    unsafe
    İşaretçi izni
    int*
    int işaretçi
    fixed
    Sabitleme
    Span<T>
    Güvenli görünüm

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