2016-01-22 3 views
65

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

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

Что лучше сделать:

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. 
     } 
    } 
} 
+3

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

+0

@AustinWBryan - Из того, что я прочитал, казалось бы, вы правы, и это то, что мы делаем, но я хотел бы лучше понять, в чем разница. – Dzyann

+0

@ Dzyann, похоже, нелегкий вопрос для ответа .. вам, возможно, придется терпеливо ждать ..;) Мне тоже интересно знать объяснение – Ian

ответ

55

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

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

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

37

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

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

+4

И за неизбежные комментарии, которые говорят, что это не отвечает на вопрос: это приближается к ответу на вопрос насколько возможно, учитывая, что вопрос не соответствует теме StackOverflow. @Dzyann, если вы хотите получить консультацию по дизайну, а не только технический совет, попробуйте CodeReview.SE. – Luaan

+1

@ Luaan - Спасибо, что указали это. На самом деле я не рассматриваю это как совет по дизайну, поскольку я разделил код на вопрос нашего фактического дизайна. Я интересовался тем, как небезопасные работы, потому что я искал вокруг, и мне было непонятно. – Dzyann

+9

@ Luaan Нет, это * не * ответ на вопрос. Является ли вопрос границ между SO и CR? Да. Означает ли это, что это невозможно? Я так не думаю, но если вы это сделаете, вы должны проголосовать, чтобы закрыть его как не по теме. Но любой ответ на вопрос должен ответить на вопрос, а это не так.Предоставление полу ответа - это не соответствующий ответ на мысль, что вопрос не по теме; голосование для его миграции. – KRyan

Смежные вопросы