c++ cli - ^符号是否取代c# 's "ref"c++ /CLI代码中的参数传递

本文关键字:quot c++ ref CLI 参数传递 代码 cli 符号 是否 取代 | 更新日期: 2023-09-27 18:01:25

在c#中,通过引用传递是:

void MyFunction(ref Dog dog)

但是在我目前看到的c++/CLI代码示例中,没有使用ref,而是使用^符号:

void MyFunction(Dog ^ dog)

参数传递时使用^符号直接替代ref吗?还是有我不知道的其他含义?

附加问题:我也看到很多:

Dog ^ myDog = gcnew Dog();

它看起来像*(指针)在c++中使用…它的工作原理相似吗?

谢谢!

c++ cli - ^符号是否取代c# 's "ref"c++ /CLI代码中的参数传递

如果Dog是引用类型(c#中的class),则c++/CLI的等效值为:

void MyFunction(Dog^% dog)

如果Dog是一个值类型(c#中的struct),那么c++/CLI的等效值是:

void MyFunction(Dog% dog)

作为类型装饰符^与c++中的*大致相关,%与c++中的&大致相关。

作为一元运算符,您通常仍然需要在c++/CLI中使用*而在c++中使用*,但是您通常需要在c++/CLI中使用&而在c++/CLI中使用%

^操作符的行为类似于c++/CLI中的指针。不同之处在于它是一个垃圾收集指针。所以:

Dog ^ mydog = gcnew Dog();

只是说我们将使用托管内存(gcnew)并将托管指针传递回mydog。

:

void MyFunction(Dog ^ dog)

实际上是通过地址传递,而不是引用,但它们有点相似。如果你想在C/c++中通过引用传递,你可以这样做:

void MyFunction(Dog &dog);
函数声明中的

。我认为c++/CLI也是一样的,但我从来没有尝试过。我尽量不使用ref,因为它并不总是清楚,他们是。

编辑:嗯,这是不一样的,它是% not &,这是有道理的,他们也必须改变。愚蠢的c++/CLI。

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

在托管堆上声明一个对象的句柄。

:

公共语言运行库维护一个单独的堆,在堆上实现精确的、异步的、压缩的垃圾收集方案。为了正确工作,它必须跟踪在运行时指向这个堆的所有存储位置。^提供了一个句柄,垃圾收集器可以通过它跟踪对托管堆上对象的引用,从而能够在对象移动时更新它。

"^"符号表示"Dog"是一个CLR对象,而不是像"Dog*"这样的传统c++对象,后者是指向c++对象Dog的指针。这意味着"Dog ^ Dog "在c#

中与"Dog Dog "(而不是"ref Dog Dog ")具有相同的含义。

在c++/CLI 3种类型:

  1. 手柄类型(^):句柄包含变量的地址,但如果必须移动变量以最大化可用的空闲内存,则可以在运行时更新该地址。
    示例:Person ^pp = gcnew Person(); // gcnew in C++/CLI is similar to new in C++.

  2. 参考类型(%):变量的引用别名。c++/CLI中的%类似于&在c++中。
    示例:int %ri = i; // ri is reference alias for i.
    Person %rPerson = *pp; // pp from point number 1

  3. Array Type ([]):