使用固定语句

时间:2015-12-13 16:30:16

标签: c# pointers unsafe

来自MSDN - fixed statement

  

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本身声明指针。

我错过了什么?

0 个答案:

没有答案