Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
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
В предыдущем примере вы видели, что выделение фрагмента памяти внутри небезопасного контекста может делаться с помощью ключевого слова
stackalloc
stackalloc
->
Point
Point
class PointRef // <= Renamed and retyped.
{
public int x;
public int y;
public override string ToString() => $"({x}, {y})";
}
Как вам известно, если в вызывающем коде объявляется переменная типа
Point
Point
Для фиксации переменной ссылочного типа в памяти из небезопасного контекста язык C# предлагает ключевое слово
fixed
fixed
fixed
fixed
Таким образом, если вы создали объект
Point
unsafe 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
Последнее ключевое слово С#, связанное с небезопасным кодом —
sizeof
sizeof
sizeof
static void UseSizeOfOperator()
{
Console.WriteLine("The size of short is {0}.", sizeof(short));