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

Jen*_*nix 8 c# unsafe fixed

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

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

Hei*_*nzi 6

以下声明:

fixed (int* pArray = array)
Run Code Online (Sandbox Code Playgroud)

将修复整个阵列.证明可以在C#语言规范中找到(第18.6节固定语句,强调我的):

固定指针初始化可以是下列之一:

...

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

以下声明:

fixed (int* pArray = &array[0])
Run Code Online (Sandbox Code Playgroud)

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

...    
[third fixed statement:] fixed (int* p = &a[0]) F(p);
...
Run Code Online (Sandbox Code Playgroud)

...并且第三个语句修复并获取数组元素的地址.


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

深入研究规范中的示例代码,可以发现以下内容:

...    
[third fixed statement:]  fixed (int* p = &a[0]) F(p);
[fourth fixed statement:] fixed (int* p = a) F(p);
...
Run Code Online (Sandbox Code Playgroud)

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

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