Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Příkaz fixed zabraňuje uvolnění paměti , aby přemísťoval přesunoutelnou proměnnou a deklaruje ukazatel na danou proměnnou. Adresa pevné nebo připnuté proměnné se během provádění příkazu nezmění. Deklarovaný ukazatel můžete použít pouze uvnitř odpovídajícího fixed příkazu. Deklarovaný ukazatel je jen pro čtení a nelze ho upravit:
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.
Referenční dokumentace jazyka C# dokumentuje naposledy vydané verze jazyka C#. Obsahuje také počáteční dokumentaci k funkcím ve verzi Public Preview pro nadcházející jazykovou verzi.
Dokumentace identifikuje všechny funkce, které byly poprvé představeny v posledních třech verzích jazyka nebo v aktuálních verzích Public Preview.
Návod
Informace o tom, kdy byla funkce poprvé představena v jazyce C#, najdete v článku o historii verzí jazyka C#.
Poznámka:
Příkaz můžete použít fixed pouze v nebezpečném kontextu. Kód, který obsahuje nebezpečné bloky, musí být zkompilován pomocí možnosti kompilátoru AllowUnsafeBlocks .
Deklarovaný ukazatel můžete inicializovat následujícím způsobem:
S polem, jak ukazuje příklad na začátku tohoto článku. Inicializovaný ukazatel obsahuje adresu prvního prvku pole.
S adresou proměnné. Použijte operátor address-of
&, jak ukazuje následující příklad:unsafe { int[] numbers = [10, 20, 30]; fixed (int* toFirst = &numbers[0], toLast = &numbers[^1]) { Console.WriteLine(toLast - toFirst); // output: 2 } }Pole objektů jsou dalším příkladem pohyblivých proměnných, které můžete připnout.
Pokud inicializovaný ukazatel obsahuje adresu pole objektu nebo prvku pole, příkaz zaručuje,
fixedže uvolňování paměti nepřemístí nebo nezlikviduje obsahující instanci objektu během provádění těla příkazu.S instancí typu, která implementuje metodu s názvem
GetPinnableReference. Tato metoda musí vrátit proměnnourefnespravovaného typu. Typy System.Span<T> .NET a System.ReadOnlySpan<T> použití tohoto vzoru. Můžete připnout instance rozsahu, jak ukazuje následující příklad: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 } }Další informace najdete v referenčních informacích k Span<T>.GetPinnableReference() rozhraní API.
S řetězcem, jak ukazuje následující příklad:
unsafe { var message = "Hello!"; fixed (char* p = message) { Console.WriteLine(*p); // output: H } }
Můžete přidělit paměť v zásobníku, kde není předmětem uvolňování paměti, a proto není nutné připnout. K tomu použijte stackalloc výraz.
Klíčové slovo můžete použít fixed také k deklaraci vyrovnávací paměti s pevnou velikostí.
Specifikace jazyka C#
Další informace najdete v následujících částech specifikace jazyka C#: