Aracılığıyla paylaş


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

deyimifixed, çö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.

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:

  • 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 yönetilmeyen türde bir refdeğ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.

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

C# dili belirtimi

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

Ayrıca bkz.