fixed语句阻止垃圾收集器重定位可移动变量。
fixed语句设置一个指向托管变量的指针,并在执行语句时设置变量“pins”。如果没有修复,指向可移动托管变量的指针将没什么用处,因为垃圾收集可以无法预测地重定位变量。 C#编译器只允许您在固定语句中为托管变量分配指针。
为什么我不允许直接创建一个指向我的托管变量的指针(下面的示例代码)?
using System;
class Point
{
public int x;
public int y;
public Point(int xx, int yy)
{
x = xx;
y = yy;
}
public override string ToString()
{
return string.Format("({0}, {1})", x, y);
}
}
class Program
{
static void TestPointRef()
{
Point p = new Point(3, 5); // Create a new Point instance
unsafe
{
fixed(Point* pp = &p) // <- This is not allowed
{
Console.WriteLine(*pp);
}
}
}
static int Main(string[] args)
{
TestPointRef();
return 0;
}
}
编译器抱怨并说
错误CS0208:无法获取地址,获取大小或声明 指向托管类型的指针('Point')
我以为我们允许自己使用fixed语句获取托管对象的地址?允许(如在链接中的MSDN示例中)在Point p
中声明指向值类型成员的指针,但不向p
本身声明指针。
我错过了什么?