¿Por qué no se pueden usar las referencias de seguimiento como miembros de la clase?

El siguiente código:

ref class A
{
private:
  int% referenceToAnInt;
};

produce el siguiente error en Visual Studio:

error C3160: 'int %': un miembro de datos de una clase administrada no puede tener este tipo

Pensé que el seguimiento de las referencias era algo administrado, entonces, ¿por qué no pueden ser miembros de una clase administrada? Además: ¿Cómo almacenaría correctamente una referencia a un tipo de valor en C++/CLI?

preguntado el 03 de mayo de 12 a las 14:05

Por favor, trate de hacer una pregunta a la vez. Si tienes dos preguntas diferentes, hazlas en dos publicaciones. -

2 Respuestas

El CLR no permite almacenar referencias de seguimiento como campos. Además, desde C++/CLI-Spec:

Un programa que contiene una referencia de seguimiento que tiene una duración de almacenamiento distinta a la automática tiene un formato incorrecto. (Esto impide tener una referencia de seguimiento como miembro de datos).

Supongo que querían evitar el problema de mantener una referencia por más tiempo que el tiempo de vida real del objeto al que se hace referencia. Una alternativa sería usar una clase de referencia contenedora para contener el valor, o delegados para lectura/escritura.

contestado el 03 de mayo de 12 a las 14:05

Seguimiento de referencias se encuentran las "cosa administrada", por lo que no puede usarlos como miembro de una clase. Son similares a C++ & referencias en las que puede usarlas para referirse a variables locales en algún otro método. Pero las variables locales se almacenan en la tienda a corto plazo (también conocida como la pila). Eso significa que cuando finaliza el método que contiene esa variable local, la referencia ya no sería válida, pero el objeto podría seguir existiendo.

Esto no sería seguro para la memoria, por lo que está prohibido hacerlo en .Net.

contestado el 03 de mayo de 12 a las 15:05

C++/CLI no impone la seguridad, a menos que utilice el /clr:safe cambiar para producir una salida verificable. - ben voigt

C++/CLI no lo hace, pero CLR en este caso sí. - svick

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.