Имеет ли значение использование небезопасных внутри или вне цикла?
мне никогда не приходилось использовать unsafe в прошлом, но теперь мне нужно, чтобы он работал с указателем, манипулирующим растровым изображением.
Я не смог найти никакой документации, которая указывает на обратное, но я хотел бы лучше понять, как небезопасно работает, и если это имеет значение, чтобы использовать его внутри или вне цикла.
лучше ли это делать:
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.
}
}
}
2 ответа:
unsafe
ключевое слово-это маркер, который вы используете, чтобы сообщить компилятору, что вы знаете, что делаете. Его основная цель аналогична документированию вашего кода:unsafe
блок показывает части вашего кода, которые вы обозначаете как неуправляемую территорию; нет никакого влияния на фактическое исполнение кода.имея это в виду, имеет смысл максимально уменьшить размер этой небезопасной территории, а это значит, что ваш второй подход лучше, чем первый один.
стоит отметить, что две другие альтернативы, т. е. маркировка метода и маркировка класса с
unsafe
, также уступают подходу, когда небезопасный блок помещается вокруг наименьшей возможной части кода.
unsafe
изменяет какие выражения компилятор будет принимать и выход продукции для. Он не накладывает никаких накладных расходов во время выполнения, сам по себе. Для любого выражения, которое не требуетunsafe
, компилятор будет выдавать тот же код, будь то внутриunsafe
контекст или нет.особенности , который выражения могут использоваться только в пределах
unsafe
контекст, я бы рекомендовал проконсультироваться с разделом 18 Язык C# Спецификация