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)
以下声明:
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)
修复第一个数组元素的地址.同样,来自规范的引用(来自该章中的示例):
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); ...上例中的第四个固定语句产生与第三个类似的结果.
不幸的是,他们没有详细说明" 类似结果 "的含义,但值得注意的是,他们没有说" 相同的结果 ".
| 归档时间: |
|
| 查看次数: |
506 次 |
| 最近记录: |