Operatore di riferimento di rilevamento (Estensioni del componente C++)
Un Riferimento di rilevamento (%) si comporta come un riferimento di normali C++ (&) ma quando un oggetto viene assegnato a un riferimento di rilevamento, il conteggio dei riferimenti dell'oggetto viene incrementato.
Tutte le piattaforme
Un riferimento di rilevamento presenta le seguenti caratteristiche.
L'assegnazione di un oggetto a un riferimento di rilevamento del conteggio dei riferimenti dell'oggetto viene incrementata.
Un riferimento nativo (&) è il risultato quando la derefenziate a *.Un riferimento di rilevamento (%) è il risultato quando un derefenziate ^.L'unica differenza tra e & % è che in cui & è un riferimento “non elaborato„, % è un riferimento con conteggio.Se è stata seguita da un oggetto, l'oggetto rimane attivo in memoria.
L'operatore di accesso ai membri del punto (.) viene utilizzato per accedere a un membro dell'oggetto.
Un riferimento di rilevamento può essere dichiarata solo sullo stack.Un riferimento di rilevamento non essere un membro di una classe.
I riferimenti di rilevamento sono validi per i tipi di valore e un handle (ad esempio String^).
Un riferimento di rilevamento non può essere assegnato un valore null o un valore nullptr.Un riferimento di rilevamento può essere riassegnato a un altro oggetto valido tutte le volte necessarie.
Un riferimento di rilevamento non può essere utilizzato come operatore unario di presa- indirizzo.
Windows Runtime
Un riferimento di rilevamento si comporta come un riferimento con conteggio C++ standard.Per informazioni sui riferimenti C++, vedere Riferimenti (C++).
Di seguito viene illustrato come utilizzare un riferimento di rilevamento per modificare il contenuto dell'oggetto che punta.
/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
È possibile utilizzare un riferimento di rilevamento a l quando si esegue l'associazione a un oggetto di un tipo CLR nell'heap sottoposto a garbage collection.
In CLR, il valore di una variabile di riferimento di rilevamento viene aggiornato automaticamente ogni volta che il Garbage Collector sposta l'oggetto a cui si fa riferimento.
Non è possibile avere un riferimento C++ nativa a un oggetto nell'heap sottoposto a garbage collection.
Per ulteriori informazioni sui riferimenti di rilevamento in C++/CLI, vedere:
Procedura: Passare i tipi CLR per riferimento con i riferimenti di rilevamento
Procedura: Utilizzare i riferimenti di rilevamento e i tipi di valore
Procedura: riferimenti di rilevamento di utilizzo e puntatori interni
Procedura: Scrivere funzioni del modello che accettano native, il valore, o parametri di riferimento
Esempi
Esempio
Il seguente codice di esempio mostra come utilizzare un riferimento di rilevamento con il codice nativo e tipi gestiti.
// 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;
}
Esempio
Il seguente codice di esempio mostra come associare un riferimento di rilevamento a una matrice.
// 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]);
}
Output