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++中使用…它的工作原理相似吗?
谢谢!
如果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#
在c++/CLI 3种类型:
- 手柄类型(^):句柄包含变量的地址,但如果必须移动变量以最大化可用的空闲内存,则可以在运行时更新该地址。
示例:Person ^pp = gcnew Person(); // gcnew in C++/CLI is similar to new in C++.
- 参考类型(%):变量的引用别名。c++/CLI中的%类似于&在c++中。
示例:int %ri = i; // ri is reference alias for i.
Person %rPerson = *pp; // pp from point number 1
- Array Type ([]):