嵌套的固定语句

根据fixed语句的C# 引用 :

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属性与指针变量相关联,而不是它所引脚的对象。 因此在内部范围块内部有两个固定数组的变量。 接下来有一个变量可以固定它。 它仍然是固定的。

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

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