Безопасный по сравнению с Небезопасным кодом

Считайте этот вопрос сегодня о безопасном и небезопасном коде, который я затем прочитал об этом в MSDN, но я все еще не понимаю это. Почему Вы хотели бы использовать указатели в C#? Это просто для скорости?

9
задан Community 23 May 2017 в 12:16
поделиться

3 ответа

Есть три причины использовать небезопасный код:

  • API (как отметил Джон)
  • Получение фактического адреса памяти данных (например, доступ к памяти -связанное аппаратное обеспечение)
  • Наиболее эффективный способ доступа к данным и их изменения (критичные по времени требования к производительности)
23
ответ дан 4 December 2019 в 07:04
поделиться

Иногда вам понадобятся указатели для взаимодействия вашего C # с базовой операционной системой или другим собственным кодом. Вам настоятельно не рекомендуется делать это, так как это «небезопасно» (натч).

Бывают очень редкие случаи, когда ваша производительность настолько ограничена процессором, что вам понадобится этот крохотный дополнительный бит производительности. Я бы порекомендовал написать эти части, связанные с процессором, в отдельном модуле на ассемблере или C / C ++, экспортировать API и заставить ваш код .NET вызывать этот API. Возможным дополнительным преимуществом является то, что вы можете поместить код конкретной платформы в неуправляемый модуль и оставить платформу .NET независимой.

5
ответ дан 4 December 2019 в 07:04
поделиться

Я склонен избегать этого, но есть некоторые случаи, когда это очень полезно:

  • для производительности при работе с необработанными буферами (графика и т.д.)
  • необходимо для некоторых неуправляемых API (также довольно редко для меня)
  • для обмана с данными

Для примера последнего, я поддерживаю некоторый код сериализации. Запись float в поток без необходимости использовать BitConverter. GetBytes (который каждый раз создает массив) болезненно - но я могу схитрить:

float f = ...;
int i = *(int*)&f;

Теперь я могу использовать shift (>>) и т.д. для записи i гораздо проще, чем f (байты будут идентичны тем, что я бы вызвал BitConverter.GetBytes, плюс я теперь контролирую конечность тем, как я выбираю использование shift).

4
ответ дан 4 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: