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ı
GetPinnableReference
bir yöntem uygulayan türün örneğiyle. Bu yöntem yönetilmeyen türde birref
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 } }
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: