在使用C ++ / CLI代码传递的参数中,^符号是否替换了C#的“ref”?

在C#中,通过引用传递:

void MyFunction(ref Dog dog) 

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

 void MyFunction(Dog ^ dog) 

当参数传递时,是否使用^符号直接替换ref ? 还是有其他一些我不知道的含义?

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

 Dog ^ myDog = gcnew Dog(); 

看起来它像C ++中的* (指针)一样使用。它的工作原理是否类似?

谢谢!

如果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中的指针类似。 不同之处在于它是一个垃圾收集指针。 所以:

 Dog ^ mydog = gcnew Dog(); 

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

所以:

 void MyFunction(Dog ^ dog) 

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

 void MyFunction(Dog &dog); 

在函数声明中。 我假设它对C ++ / CLI来说是一样的,但我从未尝试过。 我尽量不使用ref,因为它们并不总是很清楚。

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

从MSDN – ^ (Handle to Object on Managed Heap)

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

和:

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

“^”符号表示“Dog”是CLR对象,而不是传统的C ++对象,例如“Dog *”,它是指向C ++对象Dog的指针。 这意味着“Dog ^ dog”与C#中的“Dog dog”(不是“ref dog dog”)含义相同