为什么跟踪引用不能用作类成员?

时间:2012-05-03 13:28:25

标签: c++-cli tracking-reference

以下代码:

ref class A
{
private:
  int% referenceToAnInt;
};

在Visual Studio中生成以下错误:

错误C3160:'int%':托管类的数据成员不能具有此类型

我认为跟踪引用是一个托管的东西 - 所以为什么它们不能成为托管类的成员? 另外:如何正确地在C ++ / CLI中存储对值类型的引用?

2 个答案:

答案 0 :(得分:4)

CLR不允许将跟踪引用存储为字段。另外,来自C ++ / CLI-Spec:

  

包含具有存储持续时间的跟踪参考的程序   除了自动之外是不正确的。 (这排除了跟踪   引用作为数据成员。)

我猜他们想避免一个问题,即你保持一个引用的时间长于引用对象的实际生命周期。另一种方法是使用包装器引用类来保存值,或者使用委托进行读/写。

答案 1 :(得分:2)

跟踪引用“托管的东西”,这就是为什么你不能将它们用作类的成员。它们类似于C ++ &引用,因为您可以使用它们在其他方法中引用局部变量。但是局部变量存储在短期存储中(例如,堆栈)。这意味着当包含该局部变量的方法结束时,引用将不再有效,但该对象仍然可以存在。

这不是内存安全的,这就是为什么在.Net中禁止这样做。