studio - creacion de componentes visuales en c#
¿Cuál es la diferencia entre un tipo no administrado y un tipo administrado? (2)
No puede crear un puntero a un tipo administrado. Si bien se gestionan int, double, etc., tienen contrapartes no administradas.
Entonces, lo que realmente significa el tipo no administrado es el tipo administrado .
El problema aquí es que el tipo administrado, ya que está sentado en el montón, no puede obtener un puntero a. Puede obtener un puntero utilizando una palabra clave fija, pero eso es principalmente para matrices.
Cuando escribí el siguiente fragmento de código con fines de experimentación, se generó el error de desplazamiento (ver captura de pantalla):
No se puede declarar puntero a tipo ''no dinámico'' no administrado
El fragmento:
dynamic* pointerToDynamic = &fields;
Si bien el código claramente no está permitido (no puede tomar la dirección de un tipo administrado), me planteó la siguiente pregunta: ¿qué es un tipo no administrado y en qué se diferencia de un tipo administrado? ¿O es solo que Visual Studio intenta ser divertido?
Hay una diferencia entre los punteros no gestionados y los no gestionados.
Un puntero administrado es un identificador de un objeto en el montón administrado, y AFAIK está disponible solo en C ++ administrado. Es equivalente a la referencia C # a un objeto. El puntero no administrado, por otro lado, es equivalente a un puntero de estilo C tradicional, es decir, la dirección de una ubicación de memoria; C # proporciona unario &
operador, palabra clave fixed
y contexto unsafe
para eso.
Está intentando obtener un puntero a un campo administrado ( dynamic
es en realidad System.Object
es un disfraz), mientras que C # permite que los punteros solo se dirijan a objetos no administrados, por lo tanto, la redacción: su tipo no está administrado.
Un poco más sobre esto here .
Actualización: para que sea más claro, C ++ administrado admite punteros y referencias de estilo C clásico. Pero para mantener la terminología de C ++ consistente, se les llama punteros no administrados y administrados , de manera correspondiente. C # también admite punteros (explícitamente en contextos unsafe
) y referencias (implícitamente cuando se trata de objetos de tipos de referencia), pero este último no se denomina "punteros administrados", solo son referencias.
En resumen: en C ++ hay punteros no administrados y administrados, en C # - punteros y referencias no administrados.
Espero que tenga sentido ahora.