Какая разница между неуправляемым типом и управляемым типом?

Когда я написал следующий фрагмент для экспериментов, он поднял ошибку hover (см. снимок экрана):

Невозможно объявить указатель на неуправляемый тип 'dynamic'

Отрывок:

dynamic* pointerToDynamic = &fields;

Хотя код явно не разрешен (вы не можете взять адрес управляемого типа), он задал мне вопрос: что такое неуправляемый тип и как он отличается от управляемый тип? Или просто Visual Studio пытается быть забавным?

enter image description here

Ответы

Ответ 1

Существует разница между неуправляемыми и не управляемыми указателями.

Управляемый указатель - это дескриптор объекта в управляемой куче, а AFAIK доступен только в управляемом С++. Это эквивалентно ссылке С# на объект. С другой стороны, неуправляемый указатель эквивалентен традиционному указателю стиля С, то есть адресу ячейки памяти; С# предоставляет унарный оператор &, ключевое слово fixed и контекст unsafe для этого.

Вы пытаетесь получить указатель на управляемое поле (dynamic на самом деле System.Object скрывается), а С# позволяет указателям только на неуправляемые объекты, поэтому формулировка: ваш тип не управляется.

Немного больше об этом здесь.

Обновление:, чтобы сделать его более понятным, С++ поддерживает классические указатели и ссылки на C-стиль. Но чтобы поддерживать терминологию С++, они называются неуправляемыми и управляемыми указателями, соответственно. С# также поддерживает указатели (явно в контексте unsafe) и ссылки (неявно, когда задействуются объекты ссылочных типов), но последний не, называемый "управляемыми указателями", это просто ссылки.

Подводя итог: на С++ есть неуправляемые и управляемые указатели, в С# - неуправляемые указатели и ссылки.

Надеюсь, теперь это имеет смысл.

Ответ 2

Вы не можете создать указатель на управляемый тип. В то время как int, double и т.д. Управляются, у них есть неуправляемые копии.

Итак, что означает неуправляемый тип, это управляемый тип.

Проблема заключается в том, что управляемый тип, поскольку сидит на куче, вы не можете получить указатель. Вы можете получить указатель, используя ключевое слово фиксированное, но это главным образом для массивов.