有如下代码:
Procedure Change(A:array of int32);
Procedure Change0(Var A:array of int32);
Type
ta = array[0..10] of int32;
Procedure Change2(A:ta);
Procedure Change3(Var A:ta);
Var
aa:ta;
BB:array of int32;
Implementationation
{$autobox on}
Procedure Change(A:array of int32);
Begin
A[0]:=123;
A:=BB;
End;
Procedure Change0(Var A:array of int32);
Begin
A[0]:=123;
A:=BB;
End;
Procedure Change2(A:ta);
Begin
A[0]:=123;
A:=BB;
End;
Procedure Change3(Var A:ta);
Begin
A[0]:=123;
A:=BB;
End;
然后执行下面的语句
Setlength(BB,11);bb[0]:=5678;
aa := Ta(&Array.Createinstance(Typeof(Int32),11));
aa[0]:=0;
Change(AA);
Messagebox.show(AA[0].Tosting());
If & Object(AA)=&object(BB) Then MassageBox.Show('=');
aa := Ta(&Array.Createinstance(Typeof(Int32),11));
aa[0]:=0;
Change0(AA);
Messagebox.show(AA[0].Tosting());
If & Object(AA)=&object(BB) Then MassageBox.Show('=');
aa := Ta(&Array.Createinstance(Typeof(Int32),11));
aa[0]:=0;
Change2(AA);
Messagebox.show(AA[0].Tosting());
If & Object(AA)=&object(BB) Then MassageBox.Show('=');
aa := Ta(&Array.Createinstance(Typeof(Int32),11));
aa[0]:=0;
Change3(AA);
Messagebox.show(AA[0].Tosting());
If & Object(AA)=&object(BB) Then MassageBox.Show('=');
结果发现 array of int32 方式,可以改变数组元素的值,但不能改变数组 would
Var array of int32 既可以改变数组的值,又可以改变变傘的榖地址,输出5678 min
ta方式,不能改变数组元素級級級,但是却很奇怪倪倪倪,
Var ta方式 可仏 可以改变数组元素 avoid,但是却不是123?
反汇编结果如下
Method Public Static Void Change (Int32[] A) Cil Managed
{
// Code Size: 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 Managed{ // Code Size: 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 Managed{ // Code Size: 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.s l_0023 l_0 : : STLOC.0 L_0023: ltloc.0 L_0024: Call void [mscorlib]system.array::copy([mscorlib]system.array, [mscorlib]system.array, int32) L_0029: ret } .Method Public Static Void Change3 (Int32[]& a) Cil Managed{ // Code Size: 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. f L_0010: ldloc.0 L_0011: ldc.i4.s 11 L_0013: ble.s L_0018 L_0015: ldc.i4.s 11 L_0017: stloc.0 L_0018: ldloc.0 L_0019: call void [mscorlib]System.Array::Copy ([mscorlib]system.ararray, [mscorlib]system.array, int32) L_001E: ret }结论!!
使TheArray of int32 方式,实际上应于c#的可变数目参数,即 paraams int32[]
这种参数方式是传递的数组馰地地址(即参数的值),而不是存放数组馰地址的变 change
加上Var修饰饰,即加 ODP修饰饰,传饰,是存放数组馰组馰组馰组地组地址?
使 english,则在值进进进进进进进进进进进进进进进进进进进进进进进 who,变数组首地址,也不改变原组值
加 ODP,好像传递的是变量身眰址,迿里还是没看懂是为什什什什么。
对应的c#代码为
Public Static Void Change (Params Int[] a){ A[0] = 0x7b; A = Winform.BB;}
|