Où puis-je trouver des informations sur les Get, Set et méthodes Adresse pour les instances de System.Array multidimensionnels dans .NET?
-
23-09-2019 - |
Question
System.Array sert de classe de base pour tous les tableaux dans le Common Language Runtime (CLR). Selon cet article :
Pour chaque type de tableau concret, [la] ajoute trois méthodes d'exécution 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 aux méthodes de Get
et Set
mentionnés ci-dessus peuvent être clairement visibles. Il semble que l'arité de ces méthodes est liée à la dimensionnalité du tableau, ce qui est sans doute la raison pour laquelle ils sont créés par le moteur d'exécution et ne sont pas pré-déclarés. Je ne pouvais pas trouver toutes les informations sur ces méthodes sur MSDN et leurs noms simples qui les rend résistants à la recherche sur Google. J'écris un compilateur pour un langage qui prend en charge les tableaux à plusieurs dimensions, donc je voudrais trouver une documentation officielle sur ces méthodes, dans quelles conditions je peux les attendre d'exister et ce que je peux attendre leurs signatures soient.
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 par exemple du tableau avec le type correct et dimensionnalité sur pour réfléchir, comme cela se fait dans l'exemple lié.
La solution
Regardez ici, en particulier l'article 14.2 sur les pages 63-65
Mais les plats à emporter, et vous pouvez dire de l'IL, est qu'ils sont les méthodes getter et setter pour traiter les tableaux aux positions d'index donné.
• Une méthode Get qui prend une séquence de arguments int32, un pour chaque dimension de la matrice, et renvoie un La valeur dont le type est le type d'élément de la matrice. Cette méthode est utilisée pour accéder à un élément spécifique de la matrice où les arguments spécifient l'index dans chaque dimension, en commençant par le premier, de l'élément à retour.
• Un ensemble méthode qui prend une séquence des arguments int32, un pour chaque dimension de la matrice, suivi d'un La valeur dont le type est le type d'élément de la matrice. Le type de retour de Set est nulle. Cette méthode est utilisée pour définir une élément spécifique du réseau où les arguments spécifient l'index dans chaque dimension, en commençant par la en premier lieu, de l'élément à régler et Le dernier argument spécifie la valeur à stocker dans l'élément de cible.
• Une méthode d'adresse qui prend séquence d'arguments Int32, pour une chaque dimension de la matrice, et a une type de retour qui est un pointeur managé au type d'élément de la matrice. Cette méthode est utilisée pour retourner une gestion pointeur vers un élément spécifique de la tableau où les arguments spécifient les index dans chaque dimension, en commençant avec la première, de l'élément dont l'adresse doit être renvoyée.
Edit: est pages 63-65 en utilisant la numérotation des pages du document. 73-75 dans le PDF réelle.
Autres conseils
Pour répondre à votre deuxième question, vous n'avez pas besoin de créer une instance pour obtenir un MethodInfo
pour ces méthodes. Quelque chose comme
var mi = typeof(string).MakeArrayType(6).GetMethod("Get");
va travailler pour obtenir la méthode de Get
pour le type de string[,,,,,]
.
Je ne sais pas si cela va répondre à votre question très spécifique, mais un grand texte sur le sujet (entre autres) est CLR via C # . Il obtient très en profondeur pour un grand nombre des sujets qui vous intéressent et passe beaucoup de temps avec le désassembleur regardant le fonctionnement interne de nombreux types .NET de base y compris les tableaux. Certainement la peine de vérifier.