Имеет ли значение использование небезопасных внутри или снаружи цикла?
Мне никогда не приходилось использовать небезопасное в прошлом, но теперь мне нужно, чтобы он работал с указателем, манипулирующим растровым изображением.
Я не мог найти документацию, которая указывает на другое, но я хотел бы лучше понять, как работает небезопасное, и если имеет значение использовать его внутри или вне цикла.
Лучше ли это делать:
unsafe
{
for (int x = 0; x < maxX; x++)
{
for (int y = 0; y < maxY; y++)
{
//Unsafe pointer operations here.
}
}
}
Или делать?:
for (int x = 0; x < maxX; x++)
{
for (int y = 0; y < maxY; y++)
{
unsafe
{
//Unsafe pointer operations here.
}
}
}
Ответы
Ответ 1
unsafe
ключевое слово - это маркер, который вы используете, чтобы сообщить компилятору, что вы знаете, что делаете. Его основная цель аналогична документированию вашего кода: блок unsafe
показывает части вашего кода, которые вы обозначаете как неуправляемую территорию; нет никакого влияния на фактическое выполнение кода.
Имея это в виду, имеет смысл максимально уменьшить размер этой небезопасной территории, что означает, что ваш второй подход лучше первого.
Следует отметить, что две другие альтернативы, то есть маркировка метода и маркировка класса с помощью unsafe
, также уступают подходу, когда небезопасный блок размещается вокруг наименьшей возможной части кода.
Ответ 2
unsafe
изменяет выражения, которые компилятор примет и выдаст для вывода. Он не налагает на себя накладные расходы, само по себе. Для любого выражения, которое не требует unsafe
, компилятор выдает тот же код, независимо от того, находится ли он в контексте unsafe
или нет.
Для того, какие выражения могут использоваться только в контексте unsafe
, я бы рекомендовал обратиться к разделу 18 С# Language Specification