Compartilhar via


Declaração de uma matriz CLR

A sintaxe para declarar, instanciar e inicializar uma matriz gerenciada foi alterado de Managed Extensions for C++ para Visual C++ 2010.

A declaração de um objeto de matriz do CLR no Managed Extensions era uma extensão de declaração de matriz padrão no qual um __gc palavra-chave foi colocada entre o nome do objeto matriz e a sua dimensão possivelmente preenchido de vírgula, como no seguinte par de exemplos:

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

Isso foi simplificado na nova sintaxe que usamos uma declaração de tipo de modelo semelhante da STL vector declaração. O primeiro parâmetro indica o tipo de elemento. O segundo parâmetro especifica a dimensão da matriz (com um valor padrão de 1, portanto apenas várias dimensões requerem um segundo argumento). O próprio objeto de matriz é uma alça de controle e portanto deve ser dado um chapéu. Se o tipo de elemento também é um tipo de referência, também requer um chapéu. Por exemplo, o exemplo acima, quando expresso em nova sintaxe, fica como segue:

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

Como um tipo de referência é uma alça de controle, em vez de um objeto, é possível especificar uma matriz CLR, como o tipo de retorno de uma função. (Em contraste, não é possível especificar o array nativo como o tipo de retorno de uma função.) A sintaxe para fazer isso no Managed Extensions foi um pouco não intuitiva. For example:

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

Em Visual C++ 2010, a declaração é muito mais simples. For example,

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

A inicialização de forma abreviada de uma matriz gerenciada local é suportada em ambas as versões da linguagem. For example:

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;
}

é simplificado consideravelmente na nova sintaxe (Observe que, como conversão boxing está implícito na sintaxe de novo, o __box eliminou operador – Consulte Tipos de valor e seus comportamentos para obter uma discussão):

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

Como uma matriz é um tipo de referência do CLR, a declaração de cada objeto de matriz é uma alça de controle. Portanto, os objetos de matriz devem ser alocados no heap CLR. (A notação abreviada oculta a alocação de heap gerenciado.) Aqui está uma forma explícita de uma inicialização de objeto de matriz em Managed Extensions:

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

Sob a nova sintaxe, o new expressão é substituído pelo gcnew. Os tamanhos de dimensão são passados como parâmetros para o gcnew a expressão, da seguinte maneira:

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

Na sintaxe de novo, uma lista de inicialização explícita pode seguir o gcnew expressão; Isso não era suportado em extensões gerenciadas. For example:

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

Consulte também

Referência

array (Visual C++)

Conceitos

Tipos gerenciados (C + + CL)