Waar kan ek inligting oor die te kry, stel en adres metodes vir multidimensionele System.Array gevalle in NET vind?
-
23-09-2019 - |
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.
Oplossing
Kyk hier, spesifiek artikel 14.2 op bladsye 63-65
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.