Aracılığıyla paylaş


fixed deyimi - işaretçi işlemleri için bir değişken sabitleme

deyimi fixed, çöp toplayıcının taşınabilir bir değişkeni yeniden konumlandırmasını engeller ve bu değişkene bir işaretçi bildirir. Sabit veya sabitlenmiş bir değişkenin adresi, deyiminin yürütülmesi sırasında değişmez. Bildirilen işaretçiyi yalnızca ilgili fixed deyimin içinde kullanabilirsiniz. Bildirilen işaretçi salt okunurdur ve değiştirilemez:

unsafe
{
    byte[] bytes = [1, 2, 3];
    fixed (byte* pointerToFirst = bytes)
    {
        Console.WriteLine($"The address of the first array element: {(long)pointerToFirst:X}.");
        Console.WriteLine($"The value of the first array element: {*pointerToFirst}.");
    }
}
// Output is similar to:
// The address of the first array element: 2173F80B5C8.
// The value of the first array element: 1.

Uyarı

deyimini fixed yalnızca güvenli olmayan bir bağlamda kullanabilirsiniz. Güvenli olmayan bloklar içeren kod, AllowUnsafeBlocks derleyici seçeneğiyle derlenmelidir.

Bildirilen işaretçiyi aşağıdaki gibi başlatabilirsiniz:

  • Bu makalenin başındaki örnekte gösterildiği gibi bir dizi ile. Başlatılan işaretçi, ilk dizi öğesinin adresini içerir.

  • Bir değişkenin adresiyle. Aşağıdaki örnekte gösterildiği gibi adres & işlecini kullanın:

    unsafe
    {
        int[] numbers = [10, 20, 30];
        fixed (int* toFirst = &numbers[0], toLast = &numbers[^1])
        {
            Console.WriteLine(toLast - toFirst);  // output: 2
        }
    }
    

    Nesne alanları, sabitlenebilen taşınabilir değişkenlerin başka bir örneğidir.

    Başlatılan işaretçi bir nesne alanının veya bir dizi öğesinin adresini içerdiğinde fixed , deyimi, atık toplayıcının deyim gövdesinin yürütülmesi sırasında içeren nesne örneğini yeniden konumlandırmaması veya atmaması garanti eder.

  • adlı GetPinnableReferencebir yöntem uygulayan türün örneğiyle. Bu yöntem ref bir değişken döndürmelidir. .NET bu deseni oluşturur System.Span<T> ve System.ReadOnlySpan<T> kullanır. Aşağıdaki örnekte gösterildiği gibi span örneklerini sabitleyebilirsiniz:

    unsafe
    {
        int[] numbers = [10, 20, 30, 40, 50];
        Span<int> interior = numbers.AsSpan()[1..^1];
        fixed (int* p = interior)
        {
            for (int i = 0; i < interior.Length; i++)
            {
                Console.Write(p[i]);  
            }
            // output: 203040
        }
    }
    

    Daha fazla bilgi için bkz Span<T>.GetPinnableReference() . API başvurusu.

  • Aşağıdaki örnekte gösterildiği gibi bir dize ile:

    unsafe
    {
        var message = "Hello!";
        fixed (char* p = message)
        {
            Console.WriteLine(*p);  // output: H
        }
    }
    
  • Sabit boyutlu arabellek ile.

Atık toplamaya tabi olmayan ve bu nedenle sabitlenmiş olması gerekmeyen yığında bellek ayırabilirsiniz. Bunu yapmak için bir stackalloc ifade kullanın.

fixed bildirmek için anahtar sözcüğünü de kullanabilirsiniz.

C# dil belirtimi

Daha fazla bilgi için C# dil belirtimininaşağıdaki bölümlerine bakın:

Ayrıca bakınız