Как уже упоминал Конрад, в некоторых ситуациях небезопасный доступ к памяти в C # полезен.Их не так много , но есть некоторые:
Манипулирование с помощью Bitmap
- это почти типичный пример, когда вам нужнонекоторая дополнительная производительность, которую вы можете получить, используя unsafe
.
Совместимость со старыми API (такими как WinAPI или собственные библиотеки C / C ++ DLL) - это еще одна область, в которой unsafe
может быть весьма полезен - например, вы можете захотетьдля вызова функции, которая принимает / возвращает неуправляемый указатель.
С другой стороны, вы можете написать большинство вещей, используя Marshall
class , который скрываетмногие небезопасные операции внутри вызовов методов.Это будет немного медленнее, но это вариант, если вы хотите избежать использования unsafe
(или если вы используете VB.NET, у которого нет unsafe
)
ПоложительныйПоследствия : Итак, основные положительные последствия существования unsafe
в C # состоят в том, что вы можете легче писать некоторый код (функциональная совместимость) и более эффективно писать некоторый код (манипулируя растровым изображением или, возможно, некоторыми тяжелыми числовыми вычислениями).использование массивов - хотя я не очень уверен насчет второго).
Негативные последствия : Конечно, есть некоторая цена, которую вы должны заплатить за использование unsafe
:
Код, не подлежащий проверке : код C #, написанный с использованием функций unsafe
, становится не проверяемым, что означает, что ваш код может скомпрометировать среду выполнения втем не мение.Это не большая проблема в сценарии с полным доверием (например, неограниченное настольное приложение) - у вас просто нет всех хороших гарантий .NET CLR.Однако вы не можете запустить приложение в условиях ограниченного доступа, таких как общедоступный веб-хостинг, Silverlight или частичное доверие (например, приложение, запущенное из сети).
Сборщик мусора такженужно соблюдать осторожность при использовании unsafe
.GC обычно разрешается перемещать объекты в управляемой куче (для сохранения дефрагментации памяти).Когда вы берете указатель на какой-либо объект, вам нужно использовать ключевое слово fixed
, чтобы сообщить GC, что он не может переместить объект до тех пор, пока вы не закончите (что может повлиять на производительность сборки мусора - но, конечно, в зависимости от точногосценарий).
Полагаю, что если бы C # не должен был взаимодействовать со старым кодом, он, вероятно, не поддержал бы unsafe
(и исследовательские проекты, такие как Singularity, которые пытаются создать более поддающуюся проверке операционную системуоснованный на управляемых языках определенно запрещает использовать безопасный код).Однако в реальных условиях unsafe
полезен в некоторых (редких) случаях.