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

时间:2011-07-07 20:16:58

标签: c# c++-cli

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

void MyFunction(ref Dog dog)

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

void MyFunction(Dog ^ dog)

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

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

Dog ^ myDog = gcnew Dog();

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

谢谢!

5 个答案:

答案 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种类型:

  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. 数组类型([]):