有如下代码:
手順の変更(A:INT32の配列);
手順change0(var A:int32の配列);
タイプ
ta = int32の配列[0..10];
手順change2(a:ta);
手順change3(var a:ta);
var
aa:ta;
BB:INT32の配列。
実装
{$ autobox on}
手順の変更(A:INT32の配列);
始める
a [0]:= 123;
A:= BB;
終わり;
手順change0(var A:int32の配列);
始める
a [0]:= 123;
A:= BB;
終わり;
手順change2(a:ta);
始める
a [0]:= 123;
A:= BB;
終わり;
手順change3(var a:ta);
始める
a [0]:= 123;
A:= BB;
終わり;
然后执行下面的语句
setLength(bb、11); bb [0]:= 5678;
aa:= ta(&array.createinstance(typeof(int32)、11));
aa [0]:= 0;
変更(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( '=');
int32方式、可以改变数组元素的值、但不能改变数组の配列
int32既可以改变数组的值、又可以改变变傘的榖地址、输出5678分のvar配列
ta方式、不能改变数组元素級級級、但是却很奇怪倪倪倪、
var ta方式可仏、避けてください、但是却不是123?
反汇编结果如下
メソッドpublic static void変更(int32 [] a)CILマネージド
{
//コードサイズ:13バイト
.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 {//コードサイズ:14バイト(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 LDSFLD INT32 [] WINFORM.UNITS .WINFORM :: BB L_0017:LDLEN L_0019:STLOC.0 L_001A:LD_001B:LD_001C:LD_001C L_0 :: stloc.0 l_0023:ltloc.0 l_0024: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:LDLOC.0 L_0011:LDC.I4.S 11 L_0013:L_0018 L_0015:LDC.I4.S 11 L_0017:STLOC.0 L_0018: 0 l_0019:void [mscorlib] system.array :: copy([mscorlib] system.ararray、[mscorlib] system.array、int32)l_001e:ret}结论!!
使int32方式、实际上应于c#的可变数目参数、即paraams int32 []
这种参数方式是传递的数组馰地地址(即参数的值)、而不是存放数组馰地址的变変更
加上、var修饰饰、即加odp修饰饰、传饰、是存放数组馰组馰组馰组地组地址?
使英語、则在值进进进进进进进进进进进进进进进进进进进进进进进、变数组首地址、也不改变原组值
加odp、好像传递的是变量身眰址、迿里还是没看懂是为什什什什么。
对应的C#代码为
public static void変更(params int [] a){a [0] = 0x7b; a = winform.bb;}
|