Ключевым словом unsafe можно отметить метод, класс (все методы будут не безопасными), поле (указатель), блок кода. Однако локальная переменная не может быть unsafe.
Для компиляции небезопасного кода требуется команда компилятора: csc /unsafe program.cs
Пример небезопасного кода:
Unsafe {int x = 10; int* pX, pY; pX = &x; pY = pX; *pY = 20; }
Невозможно объявить указатель на класс или массив – можно вызвать проблемы со сборщиком мусора. Ключевое слово checked не применимо к указателям.
Указатель типа void: int x = 10; void* pX = &x;
myStruct Struct = new myStruct(); myStruct *pStruct = &Struct; pStruct->X = 4; // тоже самое что (*pStruct).X = 4; long* pX = &(Struct->X); // тоже самое long* pX = &(Struct.X);
Ключевое слово fixed говорит сборщику мусора, что могут существовать указатели на члены определенных экземпляров класса, и поэтому эти экземпляры нельзя перемещать при оптимизации.
myClass Class = new myClass(); fixed (long *pX = &(Class.X)) { }
Сборщик мусора будет знать, что нельзя экземпляр Class нельзя перемещать, пока исполняется код внутри блока fixed. Stackalloc — создание высокопроизводительного массива в стеке:
decimal* pDecArr = stackalloc decimal[10]; pDecArr[0] = 3.0; // тоже самое что *pDecArr = 3.0; pDecArr[2] = 5.0; // може самое что (*pDecArr + 2) = 5.0;