在使用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”)含义相同