System.Array funge da classe base per tutti gli array nel Common Language Runtime (CLR). Secondo this article:Dove posso trovare informazioni sui metodi Get, Set e Address per istanze multidimensionali di System.Array in .NET?
Per ciascun tipo di matrice di cemento, [la] runtime aggiunge tre metodi speciali:
Get
/Set
/Address
.
e anzi se mi smontare il # codice 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]);
in CIL ricevo,
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)
in cui le chiamate ai predetti Get
e Set
metodi possono essere chiaramente visibili. Sembra che l'arità di questi metodi sia correlata alla dimensionalità dell'array, che presumibilmente è il motivo per cui sono creati dal runtime e non sono pre-dichiarati. Non sono riuscito a trovare alcuna informazione su questi metodi su MSDN e il loro semplice nome li rende resistenti a Google. Sto scrivendo un compilatore per un linguaggio che supporta array multidimensionali, quindi mi piacerebbe trovare una documentazione ufficiale su questi metodi, a quali condizioni posso aspettarmi che esistano e su cosa posso aspettarmi che siano le loro firme.
In particolare, vorrei sapere se la sua possibile ottenere un oggetto MethodInfo
per Get
o Set
per l'uso con Reflection.Emit
senza dover creare un'istanza della matrice con il tipo corretto e dimensionalità su cui riflettere, come è fatto nell'esempio collegato.
@Rob: hai un esempio per il metodo 'Address'? E hai un link che descrive il fatto che questi metodi sono generati? –
@John - se si fa clic sul collegamento "questo articolo" nel mio paragrafo iniziale, si finisce nell'articolo da cui viene presa la citazione nel secondo paragrafo. –