根据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?
}
}
上面的代码当然只是为了说明。实际使用可以是递归函数。
答案 0 :(得分:5)
这适用于您期望它工作的方式,必然如此。 fixed 属性与指针变量相关联,而不是与其固定的对象相关联。因此在内部范围块内部有两个固定数组的变量。接下来有一个变量可以固定它。它仍然固定。
当你递归,并且在方法之外声明数组时,会有更多的变量固定它。
体面的心理形象是假设 fixed 初始化对象的GCHandle。你敢于为一个对象创建尽可能多的GCHandles,GC并不介意。这实际上并不是在运行时发生的, fixed 比GCHandle更有效。它是变量的一个属性,在像ildasm.exe这样的反汇编程序中显示为[pinned]。 GC在遍历堆栈时查找属性,查找对象引用。