Le symbole ^ remplace-t-il la «réf» de C # dans le passage de paramètre dans le code C ++ / CLI?

En C #, passer par référence est:

void MyFunction(ref Dog dog) 

Mais dans les exemples de code C ++ / CLI que j’ai vus jusqu’à présent, il n’y a pas d’utilisation de ref mais à la place, ^ symbole est utilisé:

 void MyFunction(Dog ^ dog) 

L’utilisation du symbole ^ remplace-t-elle directement la ref lors du passage de paramètre? ou a-t-il une autre signification dont je ne suis pas au courant?

Question supplémentaire: Je vois aussi beaucoup de:

 Dog ^ myDog = gcnew Dog(); 

On dirait que c’est utilisé comme * (pointeur) en C ++. Est-ce que ça marche pareil?

Merci!

Si Dog est un type de référence ( class en C #), l’équivalent C ++ / CLI est:

 void MyFunction(Dog^% dog) 

Si Dog est un type de valeur ( struct en C #), l’équivalent C ++ / CLI est:

 void MyFunction(Dog% dog) 

En tant que décorateur de types , ^ correspond approximativement à * en C ++ et % correspond approximativement à & en C ++.

En tant qu’opérateur unaire , vous devez généralement toujours utiliser * dans C ++ / CLI lorsque vous utilisez * dans C ++, mais vous devez généralement utiliser % dans C ++ / CLI dans lequel vous utilisez & en C ++.

L’opérateur ^ se comporte comme un pointeur dans C ++ / CLI. La différence est qu’il s’agit d’un pointeur récupéré. Alors:

 Dog ^ mydog = gcnew Dog(); 

indique simplement que nous allons utiliser la mémoire gérée (gcnew) pour la première fois et renvoyer le pointeur géré à mydog.

Alors:

 void MyFunction(Dog ^ dog) 

Passant en fait par adresse, ne faites pas référence, mais ils sont un peu similaires. Si vous voulez passer par référence en C / C ++, procédez comme suit:

 void MyFunction(Dog &dog); 

dans la déclaration de fonction. Je suppose que ce sera la même chose pour C ++ / CLI, mais je ne l’ai jamais essayé. J’essaie de ne pas utiliser les arbitres car il n’est pas toujours évident qu’ils le soient.

EDIT: Eh bien, ce n’est pas la même chose, c’est% not &, ce qui est logique, il faudrait aussi que cela change. Stupide C ++ / CLI.

De MSDN – ^ (Handle to Object on Managed Heap) :

Déclare un descripteur à un object sur le segment de mémoire géré.

Et:

Le Common Language Runtime gère un segment de mémoire distinct sur lequel il implémente un schéma de récupération de mémoire compact, asynchrone et précis. Pour fonctionner correctement, il doit suivre tous les emplacements de stockage pouvant pointer dans ce segment de mémoire au moment de l’exécution. ^ fournit un handle à travers lequel le ramasse-miettes peut suivre une référence à un object sur le tas géré, permettant ainsi de le mettre à jour chaque fois que cet object est déplacé.

Le symbole “^” indique que “Dog” est un object CLR, et non un object C ++ traditionnel tel que “Dog *”, qui est un pointeur sur un object C ++ Dog. Cela signifie que “Dog ^ dog” a la même signification que “Dog dog” (et non “ref dog dog”) en C #