有如下代码:
Cambio de procedimiento (A: matriz de int32);
Cambio de procedimiento0 (var a: matriz de int32);
Tipo
ta = array [0..10] de int32;
Cambio de procedimiento2 (A: TA);
Cambio de procedimiento3 (var a: ta);
Varilla
AA: TA;
BB: matriz de int32;
Implementación
{$ AutoBox on}
Cambio de procedimiento (A: matriz de int32);
Comenzar
A [0]: = 123;
A: = bb;
Fin;
Cambio de procedimiento0 (var a: matriz de int32);
Comenzar
A [0]: = 123;
A: = bb;
Fin;
Cambio de procedimiento2 (A: TA);
Comenzar
A [0]: = 123;
A: = bb;
Fin;
Cambio de procedimiento3 (var a: ta);
Comenzar
A [0]: = 123;
A: = bb;
Fin;
然后执行下面的语句
SetLength (bb, 11); bb [0]: = 5678;
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Cambio (aa);
MessageBox.Show (aa [0] .tosting ());
If & object (aa) = & object (bb) y luego masajebox.show ('=');
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Change0 (aa);
MessageBox.Show (aa [0] .tosting ());
If & object (aa) = & object (bb) y luego masajebox.show ('=');
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Cambio2 (aa);
MessageBox.Show (aa [0] .tosting ());
If & object (aa) = & object (bb) y luego masajebox.show ('=');
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Cambio3 (aa);
MessageBox.Show (aa [0] .tosting ());
If & object (aa) = & object (bb) y luego masajebox.show ('=');
结果发现 matriz de int32 方式, 可以改变数组元素的值, 但不能改变数组
Varilla var de int32 既可以改变数组的值, 又可以改变变傘的榖地址, 输出 5678 min
ta 方式, 不能改变数组元素級級級, 但是却很奇怪倪倪倪,
Var ta 方式 可仏 可以改变数组元素 Evite, 但是却不是 123?
反汇编结果如下
Método Cambio de vacío estático público (int32 [] a) CIL gestionado
{
// Tamaño del código: 13 bytes (s)
.Maxstack
L_0000: LDARG.
L_0001: LDC.I4.0
L_0002: LDC.I4.S
L_0004: stelem.i4
L_0005: ldsfld int32 [] winform.units.winform :: bb
L_000A: Starg.SA
L_000C: RET
}
.Method public static void Change0 (int32 [] & a) CIL gestionado {// tamaño de código: 14 byte (s) i4.s 123 l_0005: stelem.i4 l_0006: ldarg.0 l_0007: ldsfld int32 [] winform.units. WinForm :: BB L_000C: sting.ref L_000D: RET} .Method public static void Change2 (int32 [] a) cil gestionado { // tamaño de código: 42 byte (s) :: clone () l_0006: castclass int32 [] l_000b: starg.sa l_000d: ldarg.0 l_000e: ldc. i4.0 l_000f: ldc.i4.s 123 l_0011: stelem.i4 l_0012: ldsfld int32 [] winform.units .winform :: bb l_0017: ldlen l_0019: stloc.0 l_001a: ld_001b: ld_001c: ld_001c: ble. l_0 :: stloc.0 l_0023: ltloc.0 l_0024: llamar void [mscorlib] system.array :: copy ([mscorlib] system.array, [mscorlib] system.array, int32) l_0029: ret} .Method public static void Change3 (int32 [] & a) CIL gestionado { // tamaño de código: 31 byte (s) .0 l_0003: ldc.i4.s 123 l_0005: stelem.i4 ld_0006: ldsfld int32 [] winform :: BB L_000B: LDLEN L_000D: STELC.0 L_000E: LDARG. 0 L_0019: llame void [mscorlib] system.array :: copy ([MSCORLIB] System.arArray, [MSCORLIB] System.Array, INT32) L_001E: RET}结论 !!
使 thearray of int32 方式, 实际上应于 c#的可变数目参数, 即 paraams int32 []
这种参数方式是传递的数组馰地地址 (即参数的值), 而不是存放数组馰地址的变 Cambio
加上 var 修饰饰, 即加 ODP 修饰饰, 传饰, 是存放数组馰组馰组馰组地组地址?
使 Inglés, 则在值进进进进进进进进进进进进进进进进进进进进进进进 quién, 变数组首地址, 也不改变原组值
加 ODP, 好像传递的是变量身眰址, 迿里还是没看懂是为什什什什么。
对应的 C#代码为
Cambio de vacío estático público (params int [] a) {a [0] = 0x7b; A = winform.bb;}
|