В чем разница между неуправляемым типом и управляемым типом? - PullRequest
16 голосов
/ 30 марта 2012

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

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

Фрагмент:

dynamic* pointerToDynamic = &fields;

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

enter image description here

Ответы [ 2 ]

7 голосов
/ 30 марта 2012

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

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

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

Немного подробнее об этом здесь .

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

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

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

2 голосов
/ 30 марта 2012

Нельзя создать указатель на управляемый тип. Хотя int, double и т. Д. Управляются, они имеют неуправляемые аналоги.

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

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

...