fixed deyimi - bir değişkenin temel alınan belleğe güvenle erişmesi

deyimi, fixedçöp toplayıcının taşınabilir bir değişkeni yeniden konumlandırmasını engeller ve bu değişkenin işaretçisini bildirir. Sabitlenmiş 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.

Not

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:

  • Bir dizi ile, bu makalenin başındaki örnekte gösterildiği gibi. 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 address-of & 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 bir diğer örneğidir.

    Başlatılan işaretçi bir nesne alanının veya 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ırılmaması veya atılmaması garanti eder.

  • adlı GetPinnableReferencebir yöntemi uygulayan türün örneğiyle. Bu yöntem yönetilmeyen türde bir ref değişken döndürmelidir. .NET türleri System.Span<T> ve System.ReadOnlySpan<T> bu deseni kullanın. 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.

Sabit boyutlu bir arabellek bildirmek için anahtar sözcüğünü fixed de kullanabilirsiniz.

C# dili belirtimi

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

Desen tabanlı fixed deyim hakkında bilgi için Desen tabanlı fixed deyim özellik teklifi notunu inceleyin.

Ayrıca bkz.