2011-02-18 20 views
16

Esto aparentemente es un término a prueba de Google, ya que no puedo conseguir que los motores de búsqueda no tiren los caracteres "extra". También miré en MSDN en la referencia de C++, pero parece que no puedo encontrar la referencia de C++/CLI porque no hay nada en la sección de declaraciones sobre ella.¿Qué significa la declaración Objeto C++/CLI ^% (signo de porcentaje de cuidado)?

+2

MSDN: http://msdn.microsoft.com/en-us/library/8903062a%28VS.80 % 29.aspx Vea también: http://stackoverflow.com/questions/202463/what-does-the-caret-mean-in-c-cli –

+0

@BlueRaja, si responde, lo marcaré como correcto. Acabo de encontrar ese enlace y la sección CLI adicional en los documentos. Gracias. –

+0

posible duplicado de [lo que hace el símbolo^media% en C++ proyecto] (http://stackoverflow.com/questions/4999575/what-does-the-symbol-mean-in-c-project) –

Respuesta

10

% es una tracking reference.

Es similar a una referencia nativa (Object&), pero una referencia de seguimiento puede hacer referencia a un objeto CLR mientras que una referencia nativa no. La distinción es necesaria porque el recolector de basura puede mover objetos CLR, por lo que la dirección de memoria de un objeto CLR puede cambiar.

El ^ simplemente significa que se gestiona. Ver MSDN y también this SO post.

7

Básicamente, es la versión "administrada" de Object*&, y equivalente a ref o out en un tipo de referencia en C#.

15

Significa "el paso por referencia":

void bar::foo(Object^% arg) { 
    arg = gcnew Object; // Callers argument gets updated 
} 

Lo mismo en C++:

void foo(Object** arg) { 
    *arg = new Object; 
} 

o C#:

void foo(out object arg) { 
    arg = new Object(); 
} 

C++/CLI no distingue entre ref y fuera, no hace t tiene la asignación definida característica de control que el lenguaje C# tiene, así que no hay necesidad de distinguir entre los dos. Lo mismo en VB.NET, ByRef vs ByVal.

3

Este es un puntero administrado por referencia. Así que si había algo como:

void DoSomething(System::String^% stringObject) 

en C# que se vería así:

void DoSomething(ref System.String stringObject) 
Cuestiones relacionadas