Sdílet prostřednictvím


Deklarace pole CLR

Syntaxe pro deklarování, vytváření instance a inicializace spravovaného pole se změnila ze způsobu ze Správce rozšíření pro C++ na způsob z Visual C++ 2010.

Deklarace objektu pole CLR ve spravovaném rozšíření byla přípona standardní deklarace pole, ve které bylo klíčové slovo __gc umístěno mezi název objektu pole a jeho případné dimenze určené čárkami, jako je uvedeno v následující dvojci příkladů:

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

To bylo zjednodušeno v nové syntaxi, ve které použijeme deklaraci jako u šablony podobné STL vector deklaraci. První parametr označuje typ prvku. Druhý parametr určuje dimenzi pole (výchozí hodnota 1, takže pouze pole s více dimenzemi vyžadují druhý argument). Samotný objekt pole je sledovací popisovač a proto je třeba zadat stříšku. Pokud je typ prvku také odkazový typ, tak také vyžaduje stříšku. Výše uvedený příklad při použití nové syntaxe vypadá takto:

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

Vzhledem k tomu, že odkazový typ je sledovací popisovač spíše než objekt, je možné určit pole CLR jako návratový typ funkce. (Naproti tomu není možné určit nativní pole jako návratový typ funkce.) Syntaxe pro to nebyla ve spravovaném rozšíření intuitivní. Příklad:

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

Ve Visual C++ 2010 je deklarace mnohem jednodušší. Příklad:

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

Zjednodušená inicializace místního spravovaného pole je podporována v obou verzích jazyka. Příklad:

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

je výrazně zjednodušen v nové syntaxi (všimněte si, že zabalení je implicitní v nové syntaxi, takže operátor __box byl odstraněn – viz Typy hodnot a jejich chování):

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

Vzhledem k tomu, že je pole odkazový typ CLR, deklarace každého objektu pole je sledovací popisovač. Proto musí být objekty pole přiděleny do haldy CLR. (Zjednodušený zápis skryje přidělení spravované haldy). Zde je explicitní forma inicializace objektu pole v rámci spravovaného rozšíření:

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

V nové syntaxi je výraz new nahrazen výrazem gcnew. Velikosti dimenze jsou předány jako parametry výrazu gcnew následovně:

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

V nové syntaxi může explicitní inicializační seznam použít výraz gcnew; To nebylo podporováno ve spravovaném rozšíření. Příklad:

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

Viz také

Odkaz

array (Visual C++)

Koncepty

Typy spravovaných (C + +/ CL)