2012-03-30 24 views
15

Cuando escribí el siguiente fragmento de experimentar efectos, se planteó la libración de errores (ver captura de pantalla):¿Cuál es la diferencia entre un tipo no administrado y un tipo gestionado?

Puede no declarar puntero al tipo no administrado 'dinámica'

El fragmento:

dynamic* pointerToDynamic = &fields; 

Aunque es evidente que no está permitido el código (no se puede tomar la dirección de un tipo administrado), que elevó conmigo la pregunta: ¿qué es un tipo no administrado y ¿cómo es diferente a un tipo administrado? ¿O solo es Visual Studio tratando de ser gracioso?

enter image description here

+7

Claramente, un tipo no no administrado no es un tipo no no administrado. Mmmm. –

+3

No lea demasiado en un mensaje de error torpe. La carpeta C# simplemente no admite punteros. –

+3

No hay diferencia. La redacción se debe simplemente al comportamiento esperado. "Los punteros son para tipo no administrado. Este no es uno de esos. No es un tipo no administrado". El error no es que los campos se administren, es que los campos * no están no administrados *, a pesar de que esas dos frases significan lo mismo. –

Respuesta

6

Hay una diferencia entre punteros no gestionados y no gestionados.

A gestionados puntero es un identificador de un objeto en el montón administrado, y AFAIK está disponible en manejado C++ solamente. Es equivalente a C# referencia 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 el operador & único, la palabra clave fixed y el contexto unsafe para eso.

Usted está tratando de obtener un puntero a un campo administrado (dynamic es en realidad System.Object es disfrazado), mientras que C# permite punteros a objetos no administrados solamente, por lo tanto, la redacción: el tipo no es administrado.

Un poco más en este here.

Actualización: para que sea más clara, logró C++ soporta clásica de estilo C punteros y referencias . Pero para mantener la terminología de C++ consistente, se llaman no administrados y administradospunteros, correspondientemente. C# también admite punteros (explícitamente en el contexto unsafe) y referencias (implícitamente cuando se trata de objetos de tipos de referencia), pero el último es no llamados "punteros administrados", son solo referencias.

En resumen: en C++ hay punteros administrados y no gestionados, en C# - punteros no administrados y referencias.

Espero que tenga sentido ahora.

+0

Eso tiene más sentido a la luz del error. Nunca me di cuenta de que cosas no administradas y no administradas eran cosas diferentes (y parece que solo tienes que explicar la diferencia entre punteros administrados/no administrados, error tipográfico). Pero teniendo en cuenta su último párrafo, parece una explicación razonable. – Abel

+0

@Abel: actualicé mi respuesta, lo siento si no estaba clara. Quizás es un poco mejor ahora. –

+0

Me temo que repitió lo que ya dijo;). En su primera línea, se refiere a la diferencia entre los punteros administrados ** un ** administrado y ** no - **. Este último ya no se menciona en su texto. Soy consciente de la diferencia entre los punteros (no) administrados. – Abel

2

No se puede crear un puntero a un tipo administrado. Mientras se administran int, double, etc., tienen contrapartes no administradas.

Entonces, ¿qué no no administrado tipo realmente significa es tipo administrado.

El problema aquí es que el tipo administrado ya que está en el montón, no se puede obtener un puntero. Puede obtener un puntero utilizando palabra clave fija, pero eso es principalmente para matrices.

+0

Sí, yo Estoy enterado de eso, gracias. Lo que realmente me llamó la atención es la redacción aquí. ¿Por qué IntelliSense lo llamaría un tipo no no administrado, cuando significa un tipo gestionado? En todos los demás errores relacionados, simplemente se denomina tipo gestionado. ¿Realmente no hay diferencia? Semánticamente: Limpio, sucio y no inmundo son todos diferentes. No no administrado? – Abel

Cuestiones relacionadas