Поиск

Написание небезопасного кода

При переходе с C++ на С# некоторые беспокоятся, останется ли у них "полный контроль" над памятью, когда это необходимо, — эта пробле-'ма связана с небезопасным кодом (unsafe code). Хотя название звучит угрожающе, опасность и ненадежность вовсе не являются его врожденными чертами. Это код, выделение и освобождение памяти для которого не контролируется исполняющей средой .NET. Небезопасный код дает особенно заметные преимущества при использовании указателей для взаимодействия с унаследованным кодом (таким как API для С) или когда вашему приложению требуется прямое манипулирование памятью (как правило, из соображений повышения производительности).

Вы можете писать небезопасный код, применяя ключевые слова unsafe и fixed. Первое указывает, что помеченный им блок будет работать в неуправляемом контексте. Его можно применять ко всем методам, включая конструкторы и свойства, и даже к блокам кода внутри методов. Второе отвечает за фиксацию (pinning) управляемых объектов. Фиксация налагает запрет на перемещение данного объекта сборщиком мусора (GC). По мере исполнения приложения выделенная под объекты память освобождается, в итоге остаются "фрагменты" свободной памяти. Чтобы не допустить фрагментации памяти, исполняющая среда .NET перемещает объекты, обеспечивая максимально эффективное использование памяти. Что хорошего в том, что при наличии указателя на конкретный адрес в памяти, .NET сдвинет находившийся по этому адресу объект без вашего ведома, оставив вас с неверным указателем! Поскольку GC перемещает объекты в памяти, чтобы увеличить эффективность работы приложения, будьте благоразумны, используя fixed.