Имеет ли значение использование небезопасных внутри или снаружи цикла?

Мне никогда не приходилось использовать небезопасное в прошлом, но теперь мне нужно, чтобы он работал с указателем, манипулирующим растровым изображением.

Я не мог найти документацию, которая указывает на другое, но я хотел бы лучше понять, как работает небезопасное, и если имеет значение использовать его внутри или вне цикла.

Лучше ли это делать:

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