Как закрепить весь массив в 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); ...
четвертый фиксированный оператор в приведенном выше примере дает аналогичный результат третьему.
к сожалению, они не уточняют, что именно они подразумевают под "как следствие", но стоит отметить, что они не сказали:"тот же результат".