Как C# использует указатели? Если C# - управляемый язык, и сборщик мусора хорошо справляется с предотвращением утечек памяти и освобождением памяти, то каков эффект использования указателей в C# и как «небезопасно« они?Использование указателей C#
ответ
Чтобы использовать указатели, вы должны разрешить небезопасный код и пометить методы с помощью указателей как unsafe
. Затем вы должны исправить все указатели в памяти, чтобы убедиться, что сборщик мусора не перемещает их:
byte[] buffer = new byte[256];
// fixed ensures the buffer won't be moved and so make your pointers invalid
fixed (byte* ptrBuf = buffer) {
// ...
}
Это небезопасно, потому что, теоретически, вы могли бы взять указатель, ходить все адресное пространство, и поврежден или изменить внутренние структуры данных CLR, скажем, изменить реализацию метода. Вы не можете сделать это в управляемом коде.
C# поддерживает указатели ограниченным образом. В C# указатель может быть объявлен только для хранения адреса памяти типов значений и массивов. В отличие от ссылочных типов, типы указателей не отслеживаются механизмом сбора мусора по умолчанию. Указатели также не могут указывать на ссылочный тип или даже на тип структуры, который содержит ссылочный тип. Таким образом, в чистом C# они имеют довольно ограниченное использование. Если они используются в «небезопасном» коде, они считаются довольно опасными (конечно!).
При использовании указателей в C# (внутри небезопасных кодовых блоков) память не управляется Framework. Вы несете ответственность за управление собственной памятью и очистку после себя.
... поэтому, я считаю, что достаточно «небезопасно».
- 1. Использование указателей в C++
- 2. C++ использование указателей понимания
- 3. Objective-C использование указателей
- 4. Использование памяти указателей C++
- 5. Использование указателей-структуру в C
- 6. Использование указателей в C++ Amp
- 7. C++ 11: использование умных указателей
- 8. Использование указателей - очень смущает! C++
- 9. Использование указателей в C? Confused
- 10. Использование указателей в Objective-C?
- 11. Использование указателей C# в .Net
- 12. Обычное использование указателей?
- 13. Использование указателей с классами в C++
- 14. Использование указателей в многомерных массивов в C
- 15. C++ Использование delete [] в массиве указателей класса
- 16. C++ понимание cocos2d-x использование указателей функций
- 17. Использование указателей как счетчиков на языке C
- 18. Использование указателей в C для печати строки
- 19. C++ Использование интеллектуальных указателей внутри контейнеров STL
- 20. C++ Использование указателей со структурами в функциях
- 21. Использование указателей для передачи аргументов C-String
- 22. Использование указателей функций в классе шаблонов C++
- 23. Использование указателей с экземпляром класса в C#
- 24. C#: Использование типов указателей в качестве полей?
- 25. C++. Вектор указателей и использование вектора
- 26. Использование указателей безопасно в Objective-C
- 27. C++ Использование указателей для функции сортировки выбора
- 28. Использование указателей в программировании на языке C?
- 29. Использование явных/необработанных указателей в C++
- 30. Использование указателей для манипуляции строк в c
«Память не управляется каркасом» не является технически правильной; если вы просто берете указатели на управляемые объекты (например, массивы), то память по-прежнему управляется CLR, она просто ничего не может с ней сделать, пока она «исправлена» ... – thecoop 2010-11-30 17:39:33