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


Объявление массива CLR

В Visual C++ 2010 синтаксис объявления, создания экземпляра и инициализации управляемого массива отличается от управляемых расширений для C++.

В управляемых расширениях объект массива CLR объявляется с использованием объявления стандартного массива. В этом случае между именем объекта массива и разделенными запятыми измерениями указывается ключевое слово __gc, как показано в следующих примерах:

void PrintValues( Object* myArr __gc[]);
void PrintValues( int myArr __gc[,,]);

В новом синтаксисе используется упрощенный шаблонный порядок объявления, аналогичный объявлению vector в библиотеке STL. Первый параметр определяет тип элементов массива. Второй параметр определяет число измерений массива и указывается только для многомерных массивов (по умолчанию используется значение 1). Объект массива представляет собой дескриптор отслеживания и должен сопровождаться знаком крышки. Если элементы массива имеют ссылочный тип, также необходимо использовать знак крышки. Например, с использованием нового синтаксиса приведенные выше массивы объявляются следующим образом:

void PrintValues( array<Object^>^ myArr );
void PrintValues( array<int,3>^ myArr );

Поскольку ссылочный тип представляет собой дескриптор отслеживания, а не объект, можно определить массив CLR в качестве возвращаемого значения функции. Обратите внимание, что собственный массив нельзя определить в качестве возвращаемого значения функции. В управляемых расширениях для этих целей используется интуитивно неясный синтаксис. Пример.

Int32 f() [];
int GetArray() __gc[];

В Visual C++ 2010 используется более простое объявление. Например:

array<Int32>^ f();
array<int>^ GetArray();

В обеих версиях языка поддерживается сокращенная форма инициализации локального управляемого массива. Пример.

int GetArray() __gc[] {
   int a1 __gc[] = { 1, 2, 3, 4, 5 };
   Object* myObjArray __gc[] = { 
      __box(26), __box(27), __box(28), __box(29), __box(30)
   };
   return a1;
}

В новом синтаксисе приведенный выше код значительно упрощается. Обратите внимание, что в связи с применением неявной упаковки-преобразования в новом синтаксисе не используется оператор __box (дополнительные сведения см. в разделе Типы значений и их режимы работы):

array<int>^ GetArray() {
   array<int>^ a1 = {1,2,3,4,5};
   array<Object^>^ myObjArray = {26,27,28,29,30};
   return a1;
}

Поскольку массив является ссылочным типом CLR, объявление каждого объекта массива представляет собой дескриптор отслеживания. В связи с этим память для объектов массивов следует выделят в куче CLR. (В сокращенной записи процедура выделения памяти в куче скрывается.) Ниже приведена явная форма инициализации объекта массива в управляемых расширениях:

Object* myArray[] = new Object*[2];
String* myMat[,] = new String*[4,4];

В новом синтаксисе выражение new заменяется выражением gcnew. Размеры измерений передаются в качестве параметров выражения gcnew, как показано ниже:

array<Object^>^ myArray = gcnew array<Object^>(2);
array<String^,2>^ myMat = gcnew array<String^,2>(4,4);

В новом синтаксисе список явной инициализации может следовать за выражением gcnew (в управляемых расширениях подобный синтаксис не поддерживается). Пример.

// explicit initialization list following gcnew 
// was not supported in Managed Extensions
array<Object^>^ myArray = 
   gcnew array<Object^>(4){ 1, 1, 2, 3 };

См. также

Ссылки

array (Visual C++)

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

Управляемые типы (C++/CL)