C# 嵌套固定语句

C# 嵌套固定语句,c#,garbage-collection,unsafe,C#,Garbage Collection,Unsafe,根据C#forfixed声明: fixed语句防止垃圾收集器重新定位 可移动变量。 … 执行语句中的代码后,所有固定的变量都将被删除 未固定和接受垃圾收集。因此,不要指向 这些变量在fixed语句之外 我的问题是,如果我们为同一个变量嵌套了fixed语句,我在这一页上没有找到的是什么 var data = new byte[100]; unsafe { fixed(byte* pData = data) { //pData points to the "pinne

根据C#for
fixed
声明:

fixed语句防止垃圾收集器重新定位 可移动变量。

执行语句中的代码后,所有固定的变量都将被删除 未固定和接受垃圾收集。因此,不要指向 这些变量在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?
    }
}  

当然,上面的代码仅用于说明。实际应用可能是递归函数。

这正是您所期望的工作方式,必然如此。fixed属性与指针变量关联,而不是它所固定的对象。因此,在内部范围块中有两个变量固定数组。接下来是一个固定它的变量。它仍然被钉住了

当您递归时,数组在方法之外声明,那么将有更多的变量固定它

良好的心智形象是基于这样一个假设:fixed初始化对象的GCHandle。您可以为一个对象创建任意多个GCHandles,GC并不介意。这实际上不会发生在运行时,修复比GCHandle更有效。它是变量的一个属性,在像ildasm.exe这样的反汇编程序中显示为[pinted]。GC在遍历堆栈时发现属性,查找对象引用。

另请参见: