Deklaracja tablicy CLR
Składnia deklaracji, uruchamianiu i Inicjowanie tablicy został zmieniony z rozszerzenia zarządzane dla języka C++ do Visual C++.
Rozszerzenie deklaracji tablicy standardowego, w którym był deklaracji tablicy obiektu CLR rozszerzeń zarządzanych __gc słowa kluczowego został umieszczony między nazwą obiektu array i jej wymiar ewentualnie wypełnione przecinek, jak w parę następujące przykłady:
void PrintValues( Object* myArr __gc[]);
void PrintValues( int myArr __gc[,,]);
To został uproszczony w nowe elementy składni, w którym używamy deklarację jak szablon podobny do STL vector deklaracji.Pierwszy parametr określa typ elementu.Drugi parametr określa wymiar tablicy (z domyślną wartość 1, więc tylko wiele wymiarów wymagają drugi argument).Sam obiekt array jest uchwyt śledzenia i tak musi otrzymać Baranek.Jeżeli typ elementu również jest typem odwołania, wymaga również kapelusz.Na przykład powyższy przykład, wyrażonych w nowych składni wygląda następująco:
void PrintValues( array<Object^>^ myArr );
void PrintValues( array<int,3>^ myArr );
Ponieważ typ odwołania jest uchwyt śledzenia, a nie obiektu, to można określić tablicy CLR jako typu zwrotnego funkcji. (W przeciwieństwie, to nie można określić jako zwracany typ funkcji Tablica macierzystego.) Składnia tego robić w zarządzanych rozszerzeń było mylące.Na przykład:
Int32 f() [];
int GetArray() __gc[];
W Visual C++, deklaracja jest znacznie prostsze.Na przykład:
array<Int32>^ f();
array<int>^ GetArray();
Zainicjowanie skróconego lokalnej tablicy jest obsługiwana w obu wersjach języka.Na przykład:
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;
}
jest znacznie uproszczone w nowe elementy składni (należy zauważyć, że ponieważ bokserskie jest ukryte w nowe elementy składni, __box operatora zostało wyeliminowane-patrz Typy wartości i ich zachowania (C++/CLI) do dyskusji):
array<int>^ GetArray() {
array<int>^ a1 = {1,2,3,4,5};
array<Object^>^ myObjArray = {26,27,28,29,30};
return a1;
}
Ponieważ tablicy jest typu CLR odwołania, deklaracja każdego obiektu array jest uchwyt śledzenia.W związku z tym Tablica obiektów musi zostać rozdzielona na stercie CLR. (Notację skróconą ukrywa alokację sterty zarządzanych). W tym miejscu jest jawne formularza inicjowania obiektu array w obszarze zarządzane rozszerzenia:
Object* myArray[] = new Object*[2];
String* myMat[,] = new String*[4,4];
W obszarze nowe elementy składni new wyrażenie jest zastępowany gcnew.Rozmiary wymiaru są przekazywane jako parametry do gcnew wyrażenie w następujący sposób:
array<Object^>^ myArray = gcnew array<Object^>(2);
array<String^,2>^ myMat = gcnew array<String^,2>(4,4);
W nowych składni można wykonać z listą Jawne inicjowanie gcnew wyrażenie; to nie jest obsługiwana w zarządzanych rozszerzeń.Na przykład:
// explicit initialization list following gcnew
// was not supported in Managed Extensions
array<Object^>^ myArray =
gcnew array<Object^>(4){ 1, 1, 2, 3 };