Où puis-je trouver des informations sur les Get, Set et méthodes Adresse pour les instances de System.Array multidimensionnels dans .NET?

StackOverflow https://stackoverflow.com/questions/2555769

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é.

Était-ce utile?

La solution

Regardez ici, en particulier l'article 14.2 sur les pages 63-65

http://download.microsoft.com/download/7/3/3/733AD403-90B2-4064-A81E-01035A7FE13C/MS%20Partition%20II.pdf

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top