Разработка компиляторов

       

Опасный код в С#


В общем и целом, C# достаточно успешно справляется с задачей скрытия излишних сложностей от программиста. Тем не менее, бывают случаи, когда программисту требуется полная свобода действий - например, речь может идти об ускорении каких-то фрагментов исходной программы или о необходимости работы со структурами, описанными в других языках и использующих указатели.

Специально для таких ситуаций в C# предусмотрена возможность написания опасного (unsafe) кода - для этого необходимо пометить метод или блок ключевым словом unsafe . Внутри опасных блоков можно применять операторы * и &, указатели, адресную арифметику и т.д., но, естественно, сгенерированная таким образом программа не будет гарантированно безопасной.

Еще одна особенность опасного кода - это возможность описания фиксированных (fixed) указателей. Дело в том, что прямой работе с указателями может помешать сборка мусора .NET, так как во время сборки мусора возможно перемещение всех объектов в куче. Понятно, что при перемещении объекта, с которым мы работаем через указатель, не может произойти ничего хорошего. Поэтому необходимо зафиксировать все указатели, с которыми работает опасный код; зафиксированные объекты сборщик мусора игнорирует.

Приведем пример использования опасного кода, который содержит строчку с целым строем звездочек:

class UnsafeTest { unsafe static void SquarePtrParam (int* p) { *p *= *p; }

unsafe public static void Main() { int i = 5; SquarePtrParam (&i); Console.WriteLine (i); } }



Содержание раздела