Поделиться через


Буферы фиксированного размера (Руководство по программированию на C#)

Обновлен: Ноябрь 2007

В языке C# для создания буфера с массивом фиксированного размера в структуре данных можно использовать оператор fixed. Это полезно при работе с существующим кодом, например с кодом, написанным на других языках, ранее созданными библиотеками DLL или проектами COM. Фиксированный массив может принимать любые атрибуты или модификаторы, допустимые для обычных членов структуры. Единственным ограничением является то, что массив должен иметь тип bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float или double.

private fixed char name[30];

Заметки

В предыдущих версиях языка C# объявление структуры фиксированного размера в стиле C++ было затруднительным, так как структура C# с массивом не содержит элементов массива. Вместо этого в ней присутствуют ссылки на элементы.

В языке C# версии 2.0 появилась возможность встраивания массива фиксированного размера в структуру, если он используется в блоке небезопасного кода.

Например, в версиях языка C# 2.0 размер следующего ключевого слова struct будет равен 8 байтам, если массив pathName является ссылкой на массив с распределением на кучу.

  public struct MyArray
    {
        public char[] pathName;
        private int reserved;
    }

В языке C# версии 2.0 struct можно объявить со встроенным массивом.

public struct MyArray // This code must appear in an unsafe block
{
    public fixed char pathName[128];
}

В этой структуре массив pathName имеет фиксированный размер и положение и, следовательно, может использоваться с другим небезопасным кодом.

Размер массива из 128 элементов char составляет 256 байт. В буферах фиксированного размера char на один символ всегда приходится два байта, независимо от кодировки. Это справедливо даже в том случае, когда буферы char маршалируются в методы API или структуры с CharSet = CharSet.Auto или CharSet = CharSet.Ansi. Дополнительные сведения см. в разделе CharSet.

Еще одним распространенным массивом фиксированного размера является массив bool. Размер элементов в массиве bool всегда равен одному байту. Массивы bool не подходят для создания битовых массивов или буферов.

zycewsya.alert_note(ru-ru,VS.90).gifПримечание.

За исключением памяти, созданной при помощи stackalloc, компилятор C# и среда CLR не выполняют проверку переполнения буфера безопасности. Как и при работе с любым небезопасным кодом следует проявлять осторожность.

Небезопасные буферы отличаются от обычных массивов следующим:

  • Небезопасные буферы можно использовать в небезопасном контексте.

  • Небезопасные буферы это всегда векторы или одномерные массивы.

  • В объявлении массива всегда должен присутствовать счетчик, такой как char id[8]. При этом char id[] нельзя использоваться.

  • Небезопасные буферы могут быть только полями экземпляра структур в небезопасном контексте.

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Небезопасный код и указатели (Руководство по программированию в C#)

Оператор fixed (Справочник по C#)

Взаимодействие (Руководство по программированию в C#)