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:
Cómo: Tipos CLR de paso por referencia con referencias de seguimiento
Cómo: Funciones de la escritura que ocupan natural, el valor, o parámetros de referencia
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