Безопасный и небезопасный код - PullRequest
9 голосов
/ 04 мая 2010

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

Ответы [ 4 ]

23 голосов
/ 04 мая 2010

Существует три причины для использования небезопасного кода:

  • API (как отметил Джон)
  • Получение фактического адреса памяти данных (например, доступ к отображенному в памяти оборудованию)
  • Самый эффективный способ доступа и изменения данных (требования к производительности, критичной ко времени)
5 голосов
/ 04 мая 2010

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

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

4 голосов
/ 04 мая 2010

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

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

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

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

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

0 голосов
/ 13 декабря 2012

Существует по крайней мере один управляемый .Net API, который часто делает использование указателей неизбежным. См. SecureString и Marshal.SecureStringToGlobalAllocUnicode .

только способ получить значение в виде простого текста SecureString - это использовать один из Marshal методов, чтобы скопировать его в неуправляемую память.

...