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

后端 未结 5 1896
轻奢々
轻奢々 2020-12-13 15:25

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<

相关标签:
5条回答
  • 2020-12-13 15:51

    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.

    0 讨论(0)
  • 2020-12-13 15:56

    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.

    0 讨论(0)
  • 2020-12-13 16:03

    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#

    0 讨论(0)
  • 2020-12-13 16:06

    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++.

    0 讨论(0)
  • 2020-12-13 16:08

    3 Types in C++/CLI :

    1. Handle Type (^): Handle contain address of variable but which can be updated by runtime if it has to move variable around to maximize available free memory.
      Example: Person ^pp = gcnew Person(); // gcnew in C++/CLI is similar to new in C++.

    2. Reference Type (%): Reference alias of a variable. % in C++/CLI is Similar to & in C++.
      Example: int %ri = i; // ri is reference alias for i.
      Person %rPerson = *pp; // pp from point number 1

    3. Array Type ([]):
    0 讨论(0)
提交回复
热议问题