Esta semana he estado trabajando en algún código basado en la reflexión, y durante la prueba unitaria encontré una condición inesperada: los punteros son tipos de referencia. El código de C# typeof(int).MakePointerType().IsClass
devuelve true
.¿Por qué son tipos de referencia de punteros?
Comprobé en mi Estándar de CLI anotado recién llegado, y efectivamente, los punteros están claramente definidos como tipos de referencia.
Esto me sorprendió, viniendo de un fondo de C++. Acabo de asumir que los punteros serían tipos de valor.
¿Hay alguna razón en particular por la que los tipos de puntero sean tipos de referencia y no tipos de valores?
actualización (clarificación)
Cuando se habla de punteros y referencias, las cosas a menudo a confusión en cuanto a la "puntero" y "pointee". Así que aquí hay alguna aclaración.
Tipos pueden ser tipos de referencia o los tipos de valor, pero variables de son un poco diferentes. (Lo siento, no he tenido la oportunidad de leer a través de mi CLI estándar, por lo que la terminología y los conceptos estar equivocado - me corrija, por favor!)
Teniendo en cuenta este código (conceptos variables locales de los tipos de referencia):
var x = new MyClass();
var y = x;
Las variables x
y y
no son en realidad hacen referencia a tipos, pero son referencias a un objeto que es un tipo de referencia (MyClass
es un tipo de referencia). En otras palabras, x
y y
no son instancias del tipo de referencia; solo se refieren a una instancia de tipo de referencia.
Teniendo en cuenta este código (conceptos variables locales de los tipos de valor):
var x = 13;
var y = x;
Las variables x
y y
son los tipos de valor instancias (o al menos actuar como si fueran casos).
Así que llegamos a este código:
var i = 13;
var x = &i;
var y = x;
Si el puntero tipo es un tipo referencia, entonces esto es como yo interpreto la declaración x = &i
:
- Una instancia de tipo
int*
se crea, apuntando ai
. - Dado que los punteros son tipos de referencia, esta instancia se crea en el montón (suponiendo que todos los tipos de referencia se colocan en el montón, un detalle de implementación).
x
es una referencia a esta instancia de puntero.- La instancia del puntero eventualmente se recolectará como basura, al igual que otros tipos de referencia.
- Cuando se ejecuta
y = x
, se copia la referencia.Tantoy
comox
se refieren a la misma instancia del objeto de puntero.
Quizás estoy completamente equivocado en esta interpretación.
Viniendo de experiencia en C++, tendría más sentido para mí para los punteros sean los tipos de valor, por lo que la declaración x = &i
se acaba de asignar la dirección de i
a la instancia del tipo de valor x
y y = x
copias que se ocupan de valor en y
. No se creará ningún "objeto de puntero" en el montón.
De los documentos de CLR en Type.IsClass - 'Obtiene un valor que indica si el tipo es una clase; es decir, no es un tipo de valor o interfaz '. Técnicamente, un tipo de puntero no hereda de 'System.Object', por lo que no es un objeto, tipo de valor o interfaz, sino que es una clase de acuerdo con los documentos. – thecoop