System.Array sert de classe de base pour tous les tableaux du Common Language Runtime (CLR). Selon this article:Où puis-je trouver des informations sur les méthodes Get, Set et Address pour les instances System.Array multidimensionnelles dans .NET?
Pour chaque type de tableau concret, [la] exécution ajoute trois méthodes spéciales:
Get
/Set
/Address
.
et même si je démonte ce code C#,
int[,] x = new int[1024,1024];
x[0,0] = 1;
x[1,1] = 2;
x[2,2] = 3;
Console.WriteLine(x[0,0]);
Console.WriteLine(x[1,1]);
Console.WriteLine(x[2,2]);
en CIL que je reçois,
IL_0000: ldc.i4 0x400
IL_0005: ldc.i4 0x400
IL_000a: newobj instance void int32[0...,0...]::.ctor(int32,
int32)
IL_000f: stloc.0
IL_0010: ldloc.0
IL_0011: ldc.i4.0
IL_0012: ldc.i4.0
IL_0013: ldc.i4.1
IL_0014: call instance void int32[0...,0...]::Set(int32,
int32,
int32)
IL_0019: ldloc.0
IL_001a: ldc.i4.1
IL_001b: ldc.i4.1
IL_001c: ldc.i4.2
IL_001d: call instance void int32[0...,0...]::Set(int32,
int32,
int32)
IL_0022: ldloc.0
IL_0023: ldc.i4.2
IL_0024: ldc.i4.2
IL_0025: ldc.i4.3
IL_0026: call instance void int32[0...,0...]::Set(int32,
int32,
int32)
IL_002b: ldloc.0
IL_002c: ldc.i4.0
IL_002d: ldc.i4.0
IL_002e: call instance int32 int32[0...,0...]::Get(int32,
int32)
IL_0033: call void [mscorlib]System.Console::WriteLine(int32)
IL_0038: ldloc.0
IL_0039: ldc.i4.1
IL_003a: ldc.i4.1
IL_003b: call instance int32 int32[0...,0...]::Get(int32,
int32)
IL_0040: call void [mscorlib]System.Console::WriteLine(int32)
IL_0045: ldloc.0
IL_0046: ldc.i4.2
IL_0047: ldc.i4.2
IL_0048: call instance int32 int32[0...,0...]::Get(int32,
int32)
IL_004d: call void [mscorlib]System.Console::WriteLine(int32)
où les appels vers les Get
et Set
susmentionnés méthodes peuvent être clairement visibles. Il semble que l'arité de ces méthodes est liée à la dimensionnalité du tableau, ce qui est probablement la raison pour laquelle elles sont créées par le moteur d'exécution et ne sont pas pré-déclarées. Je ne pouvais pas trouver d'informations sur ces méthodes sur MSDN et leurs noms simples les rend résistants à Google. J'écris un compilateur pour un langage qui supporte des tableaux multidimensionnels, donc j'aimerais trouver de la documentation officielle sur ces méthodes, sous quelles conditions je peux m'attendre à ce qu'elles existent et à ce que je peux attendre de leurs signatures.
En particulier, je voudrais savoir s'il est possible d'obtenir un objet MethodInfo
pour Get
ou Set
pour une utilisation avec Reflection.Emit
sans avoir à créer une instance du tableau avec le type correct et dimensionnalité sur lequel réfléchir, comme cela est fait dans l'exemple lié.
@Rob: avez-vous un exemple pour la méthode 'Address'? Et avez-vous un lien décrivant le fait que ces méthodes sont générées? –
@John - si vous cliquez sur le lien 'cet article' dans mon paragraphe d'ouverture, vous finirez par l'article à partir duquel la citation dans le deuxième paragraphe est prise. –