Does the ^ symbol replace C#'s “ref” in parameter passing in C++/CLI code?

只愿长相守 提交于 2019-12-17 22:25:10

问题


In C#, passing by reference is:

void MyFunction(ref Dog dog)

But in C++/CLI code examples I have seen so far, there is no use of ref but instead ^ symbol is used:

void MyFunction(Dog ^ dog)

Is the use of ^ symbol a direct replacement for ref when parameter passing? or does it have some other meaning I'm not aware of?

Additional Question: I also see a lot of:

Dog ^ myDog = gcnew Dog();

It looks like it's used like * (pointer) in C++.. Does it work similarly?

Thanks!


回答1:


If Dog is a reference type (class in C#) then the C++/CLI equivalent is:

void MyFunction(Dog^% dog)

If Dog is a value type (struct in C#) then the C++/CLI equivalent is:

void MyFunction(Dog% dog)

As a type decorator, ^ roughly correlates to * in C++, and % roughly correlates to & in C++.

As a unary operator, you typically still need to use * in C++/CLI where you use * in C++, but you typically need to use % in C++/CLI where you use & in C++.




回答2:


The ^ operator behaves similarly to a pointer in C++/CLI. The difference is that it's a garbage-collected pointer. So:

Dog ^ mydog = gcnew Dog();

is simply saying that we will new using the managed memory (gcnew) and pass the managed pointer back to mydog.

So:

void MyFunction(Dog ^ dog)

Is actually passing by address, not be reference, but they're kinda similar. If you want to pass by reference in C/C++ you do something like:

void MyFunction(Dog &dog);

in the function declaration. I assume it'll be the same for C++/CLI, but I've never tried it. I try not to use the ref's since it's not always clear that they are.

EDIT: Well, it's not the same, it's % not &, which makes sense they'd have to change that too. Stupid C++/CLI.




回答3:


From MSDN - ^ (Handle to Object on Managed Heap):

Declares a handle to an object on the managed heap.

And:

The common language runtime maintains a separate heap on which it implements a precise, asynchronous, compacting garbage collection scheme. To work correctly, it must track all storage locations that can point into this heap at runtime. ^ provides a handle through which the garbage collector can track a reference to an object on the managed heap, thereby being able to update it whenever that object is moved.




回答4:


The "^" symbol indicates that "Dog" is a CLR object, not a traditional C++ object such as "Dog*", which is a pointer to a C++ object Dog. This means that "Dog ^ dog" has the same meaning as "Dog dog" (not "ref Dog dog") in C#



来源:https://stackoverflow.com/questions/6616599/does-the-symbol-replace-cs-ref-in-parameter-passing-in-c-cli-code

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!