Прочитайте this question сегодня о безопасном и небезопасном коде. Затем я прочитал об этом в MSDN, но я до сих пор этого не понимаю. Почему вы хотите использовать указатели в C#? Это чисто для скорости?Safe vs Небезопасный код
ответ
Есть три причины использовать небезопасный код:
- APIs (как отмечает Джон)
- Получение фактического адреса памяти данных (например, доступ к памяти, отображенные аппаратную)
- Наиболее эффективный способ доступа и изменения данных (требования к рабочим характеристикам, критичных ко времени)
Для критически важных приложений, использующих .net, в любом случае не является умным. GC не является детерминированным и может ударить в каждый момент. Который в основном завинчивает ваше критически важное приложение. Другие пункты, которые я согласен кстати! – Henri
Еще одна причина, по которой я слышал, ссылаясь на использование небезопасного C#, заключается в том, что конфиденциальная информация, например пароль или закрытый ключ шифрования, удаляется из памяти в детерминированный момент времени. В противном случае пароль может зависеть в памяти, пока кто-то еще не захочет писать в тех же местах. – harms
Это также иногда полезно в университетских проектах. –
Иногда вам понадобятся указатели для взаимодействия вашего C# с базовой операционной системой или другим родным кодом. Вам категорически не рекомендуется делать это, так как это «небезопасно» (natch).
Будут некоторые очень редкие случаи, когда ваша производительность настолько привязана к процессору, что вам нужна эта небольшая дополнительная производительность. Моя рекомендация заключалась бы в том, чтобы написать эти CPU-интуитивные фрагменты в отдельном модуле на ассемблере или C/C++, экспортировать API, и ваш код .NET вызывает этот API. Возможным дополнительным преимуществом является то, что вы можете поместить код, специфичный для платформы, в неуправляемый модуль и оставить агностику платформы .NET.
Почему вы рекомендуете переключать языки для кода, чувствительного к производительности? Преимущества не совсем ясны. Почему бы не использовать полные возможности языка C#? –
Правильный инструмент для правильной работы? Если я собираюсь обезьяна с указателями и другими низкоуровневыми работами, я бы предпочел сделать это с C/C++, где у меня есть много инструментов в моем распоряжении. Полезные вещи, такие как встроенный ассемблер, указатели на основе и другие элементы, способные перетаскивать бит, не поддерживаются в C#. –
Я согласен, что при написании на ассемблере или C вы должны быть обеспокоены тем, как был скомпилирован код. – ChaosPandion
Склоняюсь, чтобы избежать этого, но есть некоторые моменты, когда это очень полезно:
- для выполнения работы с сырьем буферов (графиками и т.д.)
- необходимо для некоторого неуправляемого API (также довольно редко для меня)
- за обман с данными
К примеру последних, Я поддерживаю некоторый код сериализации. Дать float
в поток без использования BitConverter.GetBytes
(который создает массив каждый раз) больно - но я могу обмануть:
float f = ...;
int i = *(int*)&f;
Теперь я могу использовать сдвиг (>>
) и т.д., чтобы писать i
гораздо легче, чем запись f
будет (байты будут идентичны, если бы я вызвал BitConverter.GetBytes
, плюс теперь я контролирую сущность, как я выбираю использовать сдвиг).
Я понимаю, почему вы это делаете, но этот код на C# просто заставляет меня съеживаться. – Stephan
Мне просто пришлось смеяться, когда я увидел это: «для обмана с данными». Ты меня взломаешь, мой друг! Я не могу сказать, что я когда-либо делал это, но пример имеет прекрасный смысл! –
Существует, по крайней мере, один управляемый API .Net, который часто делает использование указателей неизбежным. См. SecureString и Marshal.SecureStringToGlobalAllocUnicode.
только способ получить простое текстовое значение SecureString
является использование одного из Marshal
методов, чтобы скопировать его в неуправляемую память.
- 1. Safe Индексация Внутри небезопасный код
- 2. небезопасный код информация
- 3. Компиляция C# небезопасный код
- 4. Небезопасный код в C#
- 5. Reflection.Emit небезопасный код
- 6. - это код ниже небезопасный?
- 7. . NET Thread небезопасный код
- 8. Код «CAS-safe» и «environment safe»
- 9. Как использовать небезопасный код в безопасном контексе?
- 10. Как работает этот небезопасный код?
- 11. Как использовать небезопасный код Unity
- 12. Небезопасный доступ к отражению vs toCharArray (производительность)
- 13. Buffer.BlockCopy vs небезопасный байт * указатель copy
- 14. Thread Safe Control - Crashing VS 2008
- 15. ConcurrentBag vs Custom Thread Safe List
- 16. Тип Safe Vs затягивая напечатал - GO Vs C
- 17. Код проверки для VS
- 18. Fail safe vs Fail fast iterators (Vectors)
- 19. именованные параметры vs type-safe builder pattern
- 20. EJB Pooling vs Thread-safe и @PreDestroy
- 21. Как назначить NULL указателю на небезопасный код?
- 22. Как устранить этот небезопасный код типичного исключения?
- 23. Как скомпилировать небезопасный код в C#
- 24. Как скомпилировать решение, использующее небезопасный код?
- 25. Windows Phone 7 и небезопасный код
- 26. Как идентифицировать небезопасный код в многопоточной среде?
- 27. Как разрешить «W1047 Небезопасный код«^оператор »« предупреждение?
- 28. Чтение из неуправляемого потока - небезопасный код, IntPtr
- 29. Как скомпилировать небезопасный код в VS2012
- 30. Небезопасный код и фиксированные операторы с StringBuilder
Если вы разумный человек, то вы никогда не * хотите * использовать указатели в C#. Они существуют в тех ситуациях, когда вы * имеете * использовать указатели на C#, хотите ли вы * хотите или нет. :-) –