A tracking reference is updated by the garbage-collected heap in much the same way that a handle to a reference is updated, when the object moves on the garbage-collected heap.
Use a tracking reference to bind to an object that could possibly be on the garbage-collected heap. Use a tracking reference to a handle when binding to an object of a CLR type on the garbage-collected heap.
It is not possible to have a native C++ reference to an object on the garbage-collected heap.
A tracking reference can point to a whole object, data member, or storage location.
A tracking reference can only be declared on the stack. A tracking reference cannot be a member of a class.
Tracking references are valid to value types and handles.
You can have references to native types and native pointers.
When a tracking reference is initialized, it performs the equivalent of a shallow copy, a "pointer" to shared memory, which is the same behavior as when you initialize a native reference. Also like a native reference, when you assign to a tracking reference, a deep copy is performed, meaning that the memory location of the value is changed.
A tracking reference cannot be assigned null. A tracking reference may be reassigned to another valid object as many times as needed.
For more information about tracking references, see: