На этой неделе я работал над некоторым кодом на основе отражения, и во время модульного тестирования обнаружилось неожиданное условие: указатели являются ссылочными типами. Код С# typeof(int).MakePointerType().IsClass
возвращает true
.
Я проверил в моем только что полученном стандартном стандарте CLI, и, конечно же, указатели четко определены как ссылочные типы.
Это было удивительно для меня, исходя из фона С++. Я только что предположил, что указатели будут типами значений.
Существует ли конкретная причина, по которой типы указателей являются ссылочными типами, а не типами значений?
Обновление (уточнение)
Говоря о указателях и ссылках, вещи часто путаются в отношении "указателя" и "указателя". Итак, здесь некоторые разъяснения.
Типы могут быть ссылочными типами или типами значений, но переменные немного отличаются. (Извините, у меня не было возможности прочитать мой стандарт 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
относятся к тому же экземпляру объекта-указателя.
Возможно, я полностью ошибаюсь в этой интерпретации.
Исходя из фона С++, для меня было бы разумнее, чтобы указатели были типами значений, поэтому оператор x = &i
просто присваивает адрес i
экземпляру типа значения x
и y = x
копирует значение адреса в y
. В куче не будет создан "объект-указатель".