Язык программирования C#9 и платформа .NET5. Страница 232
static unsafe void UsePointerToPoint(){ // Доступ к членам через указатель. Point; Point* p = &point; p->x = 100; p->y = 200; Console.WriteLine(p->ToString()); // Доступ к членам через разыменованный указатель. Point point2; Point* p2 = &point2; (*p2).x = 100; (*p2).y = 200; Console.WriteLine((*p2).ToString());}Ключевое слово stackalloc
В небезопасном контексте может возникнуть необходимость в объявлении локальной переменной, для которой память выделяется непосредственно в стеке вызовов (и потому она не обрабатывается сборщиком мусора .NET Core). Для этого в языке C# предусмотрено ключевое слово
stackalloc_аllосаstatic unsafe string UnsafeStackAlloc(){ char* p = stackalloc char[52]; for (int k = 0; k < 52; k++) { p[k] = (char)(k + 65)k; } return new string(p);} Закрепление типа посредством ключевого слова fixed
В предыдущем примере вы видели, что выделение фрагмента памяти внутри небезопасного контекста может делаться с помощью ключевого слова
stackallocstackalloc->PointPointclass PointRef // <= Renamed and retyped.{ public int x; public int y; public override string ToString() => $"({x}, {y})";}Как вам известно, если в вызывающем коде объявляется переменная типа
PointPointДля фиксации переменной ссылочного типа в памяти из небезопасного контекста язык C# предлагает ключевое слово
fixedfixedfixedfixedТаким образом, если вы создали объект
Pointunsafe static void UseAndPinPoint(){ PointRef pt = new PointRef { x = 5, y = 6 }; // Закрепить указатель pt на месте, чтобы он не мог // быть перемещен или уничтожен сборщиком мусора. fixed (int* p = &pt.x) { // Использовать здесь переменную int*! } // Указатель pt теперь не закреплен и готов // к сборке мусора после завершения метода. Console.WriteLine ("Point is: {0}", pt);}Выражаясь кратко, ключевое слово
fixedКлючевое слово sizeof
Последнее ключевое слово С#, связанное с небезопасным кодом —
sizeofsizeofsizeofstatic void UseSizeOfOperator(){ Console.WriteLine("The size of short is {0}.", sizeof(short));