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


мне никогда не приходилось использовать 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 65

2 ответа:

unsafe ключевое слово-это маркер, который вы используете, чтобы сообщить компилятору, что вы знаете, что делаете. Его основная цель аналогична документированию вашего кода:unsafe блок показывает части вашего кода, которые вы обозначаете как неуправляемую территорию; нет никакого влияния на фактическое исполнение кода.

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

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

unsafe изменяет какие выражения компилятор будет принимать и выход продукции для. Он не накладывает никаких накладных расходов во время выполнения, сам по себе. Для любого выражения, которое не требует unsafe, компилятор будет выдавать тот же код, будь то внутри unsafe контекст или нет.

особенности , который выражения могут использоваться только в пределах unsafe контекст, я бы рекомендовал проконсультироваться с разделом 18 Язык C# Спецификация