Compartir a través de


Operador de referencia de seguimiento (Extensiones de componentes de C++)

Una referencia de seguimiento (%) se comporta como una referencia de C++ normal (&) excepto en que, cuando se asigna un objeto a una referencia de seguimiento, se incrementa el recuento de referencias del objeto.

Todas las plataformas

Una referencia de seguimiento tiene las siguientes características.

  • La asignación de un objeto a una referencia de seguimiento hace que el recuento de referencias del objeto se incremente.

  • Una referencia nativa (&) es el resultado de deshacer una referencia de *. Una referencia de seguimiento (%) es el resultado de deshacer una referencia de ^. La única diferencia entre & y % es que donde & es una referencia “sin formato”, % es una referencia que se cuenta como referencia. Siempre que tenga % para un objeto, el objeto permanecerá activo en memoria.

  • Se utiliza el operador de acceso a miembros de punto (.) para tener acceso a un miembro del objeto.

  • Una referencia de seguimiento solo se puede declarar en la pila. Una referencia de seguimiento no puede ser un miembro de una clase.

  • Las referencias de seguimiento son válidas para identificadores y tipos de valor (por ejemplo, String^).

  • A una referencia de seguimiento no se puede asignar un valor null o nullptr. Una referencia de seguimiento se puede reasignar a otro objeto válido tantas veces como sea necesario.

  • Una referencia de seguimiento no se puede utilizar como un operador de toma de direcciones unario.

Windows en tiempo de ejecución

Una referencia de seguimiento se comporta como una referencia de C++ estándar contada como referencia. Para obtener información acerca de las referencias de C++, vea Referencias (C++).

En el ejemplo siguiente se muestra cómo usar una referencia de seguimiento para modificar el contenido del objeto al que apunta.

/ZW
using namespace Platform;
int main()
{
array<String^> ^arr = ref new array<String^>(10);
    int i = 0;

    for(int i = 0; i < 10; ++i){ 
        String^& s = arr[i];
        s = i++.ToString(); // changes the array content
    }
}

Common Language Runtime

Puede utilizar una referencia de seguimiento a un identificador cuando enlaza a un objeto de un tipo CLR en el montón de recolección de elementos no utilizados.

En CLR, el valor de una variable de referencia de seguimiento se actualiza de manera automática siempre que el recolector de elementos no utilizados mueve el objeto de referencia.

No es posible tener una referencia de C++ nativa a un objeto en el montón de recolección de elementos no utilizados.

Para obtener más información sobre las referencias de seguimiento en C++/CLI, vea:

Ejemplos

Ejemplo

En el ejemplo siguiente se muestra cómo usar una referencia de seguimiento con tipos administrados y nativos.

// tracking_reference_1.cpp
// compile with: /clr
ref class MyClass {
public:
   int i;
};

value struct MyStruct {
   int k;
};

int main() {
   MyClass ^ x = ref new MyClass;
   MyClass ^% y = x;   // tracking reference handle to reference object 

   int %ti = x->i;   // tracking reference to member of reference type

   int j = 0;
   int %tj = j;   // tracking reference to object on the stack

   int * pi = new int[2];
   int % ti2 = pi[0];   // tracking reference to object on native heap

   int *% tpi = pi;   // tracking reference to native pointer

   MyStruct ^ x2 = ref new MyStruct;
   MyStruct ^% y2 = x2;   // tracking reference to value object

   MyStruct z;
   int %tk = z.k;   // tracking reference to member of value type

   delete[] pi;
}

Ejemplo

En el ejemplo siguiente se muestra la manera de enlazar una referencia de seguimiento a una matriz.

// tracking_reference_2.cpp
// compile with: /clr
using namespace System;

int main() {
   array<int> ^ a = ref new array< Int32 >(5);
   a[0] = 21;
   Console::WriteLine(a[0]);
   array<int> ^% arr = a;
   arr[0] = 222;
   Console::WriteLine(a[0]);
}

Resultados