Как закрепить весь массив в C#, используя ключевое слово fixed

линия fixed (int* pArray = &array[0]) из приведенного ниже примера закрепите весь массив или просто array[0]?

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

1 ответов


следующее заявление:

fixed (int* pArray = array)

исправить полное массив. Доказательство можно найти в спецификация языка C# (раздел 18.6 фиксированная заявлением, выделено мной):

A фиксированного-указателя-инициализатора может быть одним из следующих:

...

  • выражение типа массива с элементами неуправляемого типа 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);
...

четвертый фиксированный оператор в приведенном выше примере дает аналогичный результат третьему.

к сожалению, они не уточняют, что именно они подразумевают под "как следствие", но стоит отметить, что они не сказали:"тот же результат".