有如下代码::
Verfahrensänderung (a: Array von int32);
Prozedurwechsel0 (VAR A: Array von Int32);
Typ
Ta = Array [0..10] von int32;
Verfahrensänderung2 (a: ta);
Prozedurwechsel3 (var a: ta);
Var
AA: TA;
BB: Array von int32;
Implementierung
{$ autobox on}
Verfahrensänderung (a: Array von int32);
Beginnen
A [0]: = 123;
A: = BB;
Ende;
Prozedurwechsel0 (VAR A: Array von Int32);
Beginnen
A [0]: = 123;
A: = BB;
Ende;
Verfahrensänderung2 (a: ta);
Beginnen
A [0]: = 123;
A: = BB;
Ende;
Prozedurwechsel3 (var a: ta);
Beginnen
A [0]: = 123;
A: = BB;
Ende;
然后执行下面的语句
SetLength (BB, 11); BB [0]: = 5678;
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Veränderung (AA);
MessageBox.show (aa [0] .Tosting ());
If & object (aa) = & objekt (bb) dann massagebox.show ('=');
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Wechseln0 (AA);
MessageBox.show (aa [0] .Tosting ());
If & object (aa) = & objekt (bb) dann massagebox.show ('=');
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Wechseln2 (AA);
MessageBox.show (aa [0] .Tosting ());
If & object (aa) = & objekt (bb) dann massagebox.show ('=');
aa: = ta (& array.createInstance (typeof (int32), 11));
aa [0]: = 0;
Wechseln3 (aa);
MessageBox.show (aa [0] .Tosting ());
If & object (aa) = & objekt (bb) dann massagebox.show ('=');
结果发现 Array von int32 方式, 可以改变数组元素的值, 但不能改变数组 würde
Var Array von int32 既可以改变数组的值, 又可以改变变傘的榖地址, 输出 5678 min
ta 方式, 不能改变数组元素級級級, 但是却很奇怪倪倪倪,,
Var ta 方式 可仏 可以改变数组元素 vermeiden, 但是却不是 123?
反汇编结果如下
Methode öffentliche statische Leereänderung (INT32 [] A) CIL verwaltet
{
// Codegröße: 13 Byte (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 verwaltet {// Codegröße: 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 verwaltet { // Codegröße: 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. L_0 :: STLOC.0 L_0023: LTLOC.0 L_0024: Rufen Sie void [mscorlib] system.Array :: copy ([Mscorlib] System.Array, [Mscorlib] System.Array, Int32) L_0029: RET} .Method public static void Change3 (int32 [] & a) CIL verwaltet { // Codegröße: 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: Rufen Sie void [mscorlib] System.Array :: Copy ([Mscorlib] System.ararray, [MSCORLIB] System.Array, int32) L_001E: RET}结论 !!
使 Thearray of Int32 方式, 实际上应于 c#的可变数目参数, 即 paraams int32 []
这种参数方式是传递的数组馰地地址 (即参数的值), 而不是存放数组馰地址的变 Veränderung
加上 var 修饰饰, 即加 odp 修饰饰, 传饰, 是存放数组馰组馰组馰组地组地址?
使 Englisch, 则在值进进进进进进进进进进进进进进进进进进进进进进进 wer, 变数组首地址, 也不改变原组值
加 ODP, 好像传递的是变量身眰址, 迿里还是没看懂是为什什什什么。
对应的 c#代码为
Public static void Änderung (Params int [] a) {a [0] = 0x7b; A = winForm.bb;}
|