有如下代码:
Changement de procédure (A: Array of INT32);
Changement de procédure0 (var a: tableau d'int32);
Taper
TA = Array [0..10] de Int32;
Changement de procédure2 (A: TA);
Changement de procédure3 (var a: ta);
Var
aa: ta;
BB: tableau d'int32;
Mise en œuvre
{$ autobox sur}
Changement de procédure (A: Array of INT32);
Commencer
A [0]: = 123;
A: = BB;
Fin;
Changement de procédure0 (var a: tableau d'int32);
Commencer
A [0]: = 123;
A: = BB;
Fin;
Changement de procédure2 (A: TA);
Commencer
A [0]: = 123;
A: = BB;
Fin;
Changement de procédure3 (var a: ta);
Commencer
A [0]: = 123;
A: = BB;
Fin;
然后执行下面的语句
SetLength (bb, 11); bb [0]: = 5678;
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Changer (aa);
MessageBox.show (aa [0] .tosting ());
Si & object (aa) = & object (bb) alors massagebox.show ('=');
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Change0 (aa);
MessageBox.show (aa [0] .tosting ());
Si & object (aa) = & object (bb) alors massagebox.show ('=');
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Change2 (aa);
MessageBox.show (aa [0] .tosting ());
Si & object (aa) = & object (bb) alors massagebox.show ('=');
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Changement3 (aa);
MessageBox.show (aa [0] .tosting ());
Si & object (aa) = & object (bb) alors massagebox.show ('=');
结果发现 tableau d'int32 方式, 可以改变数组元素的值, 但不能改变数组
Var tableau d'int32 既可以改变数组的值, 又可以改变变傘的榖地址, 输出 5678 min
ta 方式, 不能改变数组元素級級級, 但是却很奇怪倪倪倪,
Var ta 方式 可仏 可以改变数组元素 éviter, 但是却不是 123?
反汇编结果如下
Méthode Public Static Void Changement (INT32 [] A) Géré CIL
{
// Taille de code: 13 octets (s)
.Maxstack
L_0000: ldarg.
L_0001: ldc.i4.0
L_0002: ldc.i4.
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 Managed {// Taille de code: 14 octets (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 Managed { // Taille de code: 42 octets (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.s l_001b: ld_001c: ld_001c: ble.s l_00233 l_0 :: STLOC.0 L_0023: ltloc.0 l_0024: appel void [mscorLib] System.array :: copy ([mscorLib] System.array, [mscorLib] System.array, Int32) L_0029: RET} .Method public static void change3 (int32 [] & a) CIL Managed { // Taille de code: 31 octets (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: appel void [mscorLib] System.array :: Copy ([MSCorLib] System.arArray, [MSCorLib] System.array, Int32) L_001E: RET}结论 !!
使 TheArray of Int32 方式, 实际上应于 C # 的可变数目参数, 即 Paraams int32 []
这种参数方式是传递的数组馰地地址 (即参数的值), 而不是存放数组馰地址的变 Changement
加上 var 修饰饰, 即加 ODP 修饰饰, 传饰, 是存放数组馰组馰组馰组地组地址?
使 anglais, 则在值进进进进进进进进进进进进进进进进进进进进进进进 qui, 变数组首地址, 也不改变原组值
加 ODP, 好像传递的是变量身眰址, 迿里还是没看懂是为什什什什么。
对应的 C # 代码为
Public static void Change (params int [] a) {a [0] = 0x7b; A = winform.bb;}
|