C# → Небезопасный код

Ключевым словом 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;