在C#中,通过引用传递:
void MyFunction(ref Dog dog)
但是到目前为止我看到的C ++ / CLI代码示例中没有使用ref
,而是使用了^
符号:
void MyFunction(Dog ^ dog)
参数传递时,^
符号的使用是否直接替代ref
?还是有其他一些我不知道的含义?
附加问题:我也看到了很多:
Dog ^ myDog = gcnew Dog();
看起来它像C ++中的*
(指针)一样使用。它的工作原理是否类似?
谢谢!
答案 0 :(得分:31)
如果Dog
是引用类型(C#中的class
),则C ++ / CLI等效项为:
void MyFunction(Dog^% dog)
如果Dog
是值类型(C#中的struct
),则C ++ / CLI等效项为:
void MyFunction(Dog% dog)
作为类型装饰器,^
与C ++中的*
大致相关,%
与C ++中的&
大致相关。
作为一元运算符,您通常仍需要在C ++ / CLI中使用*
,而在C ++中使用*
,但通常需要使用{{1在C ++ / CLI中,您在C ++中使用%
。
答案 1 :(得分:2)
^运算符的行为与C ++ / CLI中的指针类似。不同之处在于它是一个垃圾收集指针。所以:
Dog ^ mydog = gcnew Dog();
简单地说我们将使用托管内存(gcnew)将新内容传递回mydog。
所以:
void MyFunction(Dog ^ dog)
实际上是通过地址传递,而不是引用,但它们有点类似。如果你想在C / C ++中通过引用传递,你可以这样做:
void MyFunction(Dog &dog);
在函数声明中。我假设它对C ++ / CLI来说是一样的,但我从未尝试过。我尽量不使用ref,因为它并不总是很清楚。
编辑:嗯,它不一样,它不是&%;这是有道理的,他们也必须改变它。愚蠢的C ++ / CLI。
答案 2 :(得分:1)
来自MSDN - ^ (Handle to Object on Managed Heap)
:
声明托管堆上对象的句柄。
和
公共语言运行库维护一个单独的堆,在该堆上实现精确的,异步的,压缩的垃圾收集方案。要正常工作,它必须跟踪可在运行时指向此堆的所有存储位置。 ^提供了一个句柄,垃圾收集器可以通过该句柄跟踪对托管堆上对象的引用,从而能够在移动该对象时更新它。
答案 3 :(得分:1)
“^”符号表示“Dog”是CLR对象,而不是传统的C ++对象,例如“Dog *”,它是指向C ++对象Dog的指针。这意味着“Dog ^ dog”与C#中的“Dog dog”(而非“ref dog dog”)具有相同的含义
答案 4 :(得分:0)
C ++ / CLI中的3种类型:
Person ^pp = gcnew Person(); // gcnew in C++/CLI is similar to new in C++.
int %ri = i; // ri is reference alias for i.
Person %rPerson = *pp; // pp from point number 1