3

以下代码:

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

在 Visual Studio 中产生以下错误:

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

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

4

2 回答 2

4

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

包含具有非自动存储持续时间的跟踪引用的程序是格式错误的。(这排除了将跟踪引用作为数据成员。)

我猜他们想避免让引用比被引用对象的实际生命周期更长的问题。另一种方法是使用包装器 ref 类来保存值,或使用委托进行读/写。

于 2012-05-03T13:59:32.817 回答
2

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

这不会是内存安全的,这就是.Net 中禁止这样做的原因。

于 2012-05-03T14:04:45.153 回答