2

以下两个函数有什么区别?

ref class SomeClass;

void swap(SomeClass^& a, SomeClass^& b){
    SomeClass^ c = a;
    a = b;
    b = c;
}

void swap2(SomeClass^% a, SomeClass^% b){
    SomeClass^ c = a;
    a = b;
    b = c;
}
4

2 回答 2

1

引用和跟踪引用之间的主要区别在于,跟踪引用允许被垃圾收集移动。

在 gc 运行期间,对象会四处移动。如果你在一个对象被它的地址移动之后访问它,你就读到了垃圾。这就是跟踪句柄的作用。它知道 gc 及其对象的移动。移动后您仍然可以访问该对象。

来自MSDN

跟踪引用类似于 C++ 引用,指定通过引用将变量传递给函数并为对象创建替代名称。但是,跟踪引用所引用的对象可以在公共语言运行时垃圾收集器执行期间移动。

我不知道获取 gc 对象的引用 (&) 是否会阻止它被 gc 移动。

于 2009-12-16T06:49:07.103 回答
0

我的猜测是,第二种情况不能从 C++/CLI(例如,VB、C# 等)外部使用,而第一种情况可以。不过我没试过。

于 2009-12-16T23:24:44.690 回答