嵌套的固定语句

时间:2018-02-14 08:49:17

标签: c# garbage-collection unsafe

根据fixed声明的C#reference

  

fixed语句阻止垃圾收集器重定位   可变变量。
  ...
  执行语句中的代码后,任何固定的变量都是   取消固定并进行垃圾收集。因此,不要指向   那些变量在固定陈述之外。

我的问题是,如果我们为同一个变量嵌套了fixed语句,那么我在这个页面上找不到的内容是什么?

var data = new byte[100];
unsafe
{
    fixed(byte* pData = data)
    {
        //pData points to the "pinned" variable
        fixed(byte* pData2 = data)
        {
            //pData points to the "pinned" variable
            //pData2 points to the "pinned" variable
        }
        //Does pData still point to the "pinned" variable?
    }
}  

上面的代码当然只是为了说明。实际使用可以是递归函数。

1 个答案:

答案 0 :(得分:5)

这适用于您期望它工作的方式,必然如此。 fixed 属性与指针变量相关联,而不是与其固定的对象相关联。因此在内部范围块内部有两个固定数组的变量。接下来有一个变量可以固定它。它仍然固定。

当你递归,并且在方法之外声明数组时,会有更多的变量固定它。

体面的心理形象是假设 fixed 初始化对象的GCHandle。你敢于为一个对象创建尽可能多的GCHandles,GC并不介意。这实际上并不是在运行时发生的, fixed 比GCHandle更有效。它是变量的一个属性,在像ildasm.exe这样的反汇编程序中显示为[pinned]。 GC在遍历堆栈时查找属性,查找对象引用。