如何使用关键字fixed在C#中固定整个数组

时间:2015-09-03 20:12:21

标签: c# fixed unsafe

以下示例中的行fixed (int* pArray = &array[0])是否会固定整个数组,或只是array[0]

int array = new int[10];
unsafe {
    fixed (int* pArray = &array[0]) { } // or just 'array'
}

1 个答案:

答案 0 :(得分:6)

以下声明:

fixed (int* pArray = array)

将修复完整数组。证明可以在C# language specification中找到(第18.6节固定陈述,强调我的):

  

fixed-pointer-initializer 可以是以下之一:

     

...

     
      
  • 具有非托管类型T的元素的数组类型的表达式,前提是类型T *可隐式转换为fixed语句中给出的指针类型。在这种情况下,初始化程序计算数组中第一个元素的地址,并且保证整个数组在固定语句的持续时间内保持固定地址。 ...
  •   

以下声明:

fixed (int* pArray = &array[0])

修复第一个数组元素的地址。同样,来自规范的引用(来自该章中的示例):

...    
[third fixed statement:] fixed (int* p = &a[0]) F(p);
...
     

...以及第三个声明修正并获取数组元素的地址。

旁注:我认为修复第一个元素的任何理智的实现只是修复整个数组,但规范似乎并不能保证它。

深入研究规范中的示例代码,揭示了以下内容:

...    
[third fixed statement:]  fixed (int* p = &a[0]) F(p);
[fourth fixed statement:] fixed (int* p = a) F(p);
...
     

上例中的第四个固定语句产生与第三个类似的结果。

不幸的是,他们没有详细说明" 类似的结果",但值得注意的是他们并没有说" 相同结果"