На этой неделе я работал над некоторым основанным на отражении кодом и во время модульного тестирования обнаружил неожиданное условие: указатели являются ссылочными типами. Код C # typeof(int).MakePointerType().IsClass
возвращает true
.
Я зарегистрировал свой только что прибывший аннотированный стандарт CLI, и, безусловно, указатели четко определены как ссылочные типы.
Это меня удивило, пришло из C ++ фона. Я только что предположил, что указатели будут типами значений.
Есть ли конкретная причина, по которой типы указателей являются ссылочными типами, а не типами значений?
Обновление (уточнение)
Когда речь идет об указателях и ссылках, часто возникает путаница в отношении "указателя" и "указателя". Итак, вот некоторые пояснения.
Типы могут быть ссылочными типами или типами значений, но переменные немного отличаются. (Извините, у меня не было возможности прочитать мой стандарт CLI, поэтому терминология и концепции могут быть неправильными - поправьте меня, пожалуйста!)
Учитывая этот код (концепции локальных переменных для ссылочных типов):
var x = new MyClass();
var y = x;
Переменные x
и y
на самом деле не являются ссылочными типами, но они являются ссылками на объект, который является ссылочным типом (MyClass
является ссылочным типом). Другими словами, x
и y
не являются экземплярами ссылочного типа; они относятся только к экземпляру ссылочного типа.
С учетом этого кода (понятия локальных переменных для типов значений):
var x = 13;
var y = x;
Переменные x
и y
являются типами значений экземпляров (или, по крайней мере, действуют как экземпляры).
Итак, мы приходим к этому коду:
var i = 13;
var x = &i;
var y = x;
Если указатель тип является ссылочным типом , то я так интерпретирую оператор x = &i
:
- Создается экземпляр типа
int*
, указывающий на i
.
- Поскольку указатели являются ссылочными типами, этот экземпляр создается в куче (при условии, что все ссылочные типы размещены в куче, подробности реализации).
x
является ссылкой на этот экземпляр указателя.
- Экземпляр указателя будет в конечном итоге собираться мусором, как и другие ссылочные типы.
- Когда выполняется
y = x
, ссылка копируется. И y
, и x
ссылаются на один и тот же экземпляр объекта указателя.
Возможно, я совершенно не прав в этой интерпретации.
Исходя из фона C ++, для меня было бы более разумно, чтобы указатели были типами значений, поэтому оператор x = &i
просто присваивает адрес i
экземпляру типа значения x
, и y = x
копирует это значение адреса в y
. «Объект-указатель» не будет создан в куче.