以下示例中的行fixed (int* pArray = &array[0])
是否会固定整个数组,或只是array[0]
?
int array = new int[10];
unsafe {
fixed (int* pArray = &array[0]) { } // or just 'array'
}
答案 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); ...
上例中的第四个固定语句产生与第三个类似的结果。
不幸的是,他们没有详细说明" 类似的结果",但值得注意的是他们并没有说" 相同结果"