Waar kan ek inligting oor die te kry, stel en adres metodes vir multidimensionele System.Array gevalle in NET vind?

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

Vra

System.Array dien as die basis klas vir alle skikkings in die Common Language Runtime (CLR). Volgens hierdie artikel :

  

Vir elke tipe beton skikking, [die] runtime voeg drie spesiale metodes:. Get / Set / Address

en inderdaad as ek demontage hierdie C # kode,

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]);

in CIL ek kry,

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)

waar die oproepe na die voorgenoemde Get en Set metodes duidelik gesien kan word. Dit wil voorkom asof die arity van hierdie metodes is wat verband hou met die dimensionaliteit van die skikking, wat vermoedelik die rede waarom hulle is geskep deur die runtime en is nie vooraf verklaar. Ek kon dit nie vind enige inligting oor hierdie metodes op MSDN en hul eenvoudige name maak hulle weerstand teen Googlen. Ek skryf 'n vertaler vir 'n taal wat multidimensionele skikkings ondersteun, so ek wil graag 'n paar amptelike dokumentasie oor hierdie metodes, onder watter omstandighede ek kan verwag dat hulle bestaan ??en wat ek kan verwag dat hul handtekeninge te wees vind.

In die besonder, ek wil of sy moontlik weet om 'n MethodInfo voorwerp vir Get of Set vir gebruik met Reflection.Emit kry sonder om 'n byvoorbeeld van die skikking met die korrekte tipe en dimensionaliteit op te skep wat om te besin, soos gedoen in die verband voorbeeld.

Was dit nuttig?

Oplossing

Kyk hier, spesifiek artikel 14.2 op bladsye 63-65

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

Maar die afhaal, en jy kan vertel van die IL, is dat hulle die lucky en setter metodes vir die hantering van skikkings aan die gegewe indeks posisies.

  

• 'n get metode wat 'n reeks van neem   int32 argumente, een vir elke   dimensie van die skikking, en opbrengste 'n   waarde wie se tipe is die element tipe   van die skikking. Hierdie metode word gebruik om   toegang tot 'n spesifieke element van die skikking   waar die argumente spesifiseer die indeks   in elke dimensie, wat begin met   die eerste, van die element te wees   teruggekeer.

     

• 'n Stel metode wat 'n reeks neem   van int32 argumente, een vir elke   dimensie van die skikking, gevolg deur 'n   waarde wie se tipe is die element tipe   van die skikking. Die terugkeer tipe Stel   nietig. Hierdie metode word gebruik om stel 'n   spesifieke element van die skikking waar   die argumente spesifiseer die indeks in   elke dimensie, wat begin met die   eerste, van die element om in te lê en   die finale argument spesifiseer die waarde   gestoor word in die teiken element.

     

• 'n adres metode wat 'n duur   volgorde van int32 argumente, een vir   elke dimensie van die skikking, en het 'n   terugkeer tipe wat is 'n bestuurde wyser   om die skikking se element tipe. hierdie   metode word gebruik om terug te keer 'n bestuurde   wyser na 'n spesifieke element van die   array waar die argumente spesifiseer die   indeks in elke dimensie, begin   met die eerste, van die element waarvan   adres teruggestuur moet word.

Edit: Dis bladsye 63-65 met behulp van die dokument se bladsy nommers. 73-75 in die werklike PDF.

Ander wenke

Om jou tweede vraag te beantwoord, het jy nie nodig het om 'n geval te skep om 'n MethodInfo vir hierdie metodes te kry. Iets soos

var mi = typeof(string).MakeArrayType(6).GetMethod("Get");

sal werk om die Get metode vir die string[,,,,,] tipe kry.

Ek is nie seker of dit jou baie spesifieke vraag maar 'n groot teks oor die onderwerp (onder andere) sal aanspreek is CLR via C # . Dit raak baie in-diepte vir baie van die onderwerpe wat jy belangstel in en spandeer baie tyd saam met my disassembler kyk na die innerlike werking van baie base NET tipes insluitend skikkings. Beslis die moeite werd uitcheck.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top