有如下代码 :
절차 변경 (a : int32 배열);
절차 변경 0 (var a : int32 배열);
유형
int32의 ta = 배열 [0..10];
절차 변경 2 (a : ta);
절차 변경 3 (var a : ta);
var
AA : TA;
BB : INT32의 배열;
구현
{$ autobox on}
절차 변경 (a : int32 배열);
시작하다
a [0] : = 123;
A : = BB;
끝;
절차 변경 0 (var a : int32 배열);
시작하다
a [0] : = 123;
A : = BB;
끝;
절차 변경 2 (a : ta);
시작하다
a [0] : = 123;
A : = BB;
끝;
절차 변경 3 (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) 그런 다음 MassageBox.show ( '=');
aa : = ta (& array.createinstance (typeof (int32), 11);
AA [0] : = 0;
change0 (aa);
messagebox.show (aa [0] .tosting ());
if & object (aa) = & object (bb) 그런 다음 MassageBox.show ( '=');
aa : = ta (& array.createinstance (typeof (int32), 11);
AA [0] : = 0;
change2 (aa);
messagebox.show (aa [0] .tosting ());
if & object (aa) = & object (bb) 그런 다음 MassageBox.show ( '=');
aa : = ta (& array.createinstance (typeof (int32), 11);
AA [0] : = 0;
change3 (aa);
messagebox.show (aa [0] .tosting ());
if & object (aa) = & object (bb) 그런 다음 MassageBox.show ( '=');
结果发现 int32 方式의 배열, 可以改变数组元素的值, 但不能改变数组
int32 既可以改变数组的值, 又可以改变变傘的榖地址, 输出 5678 분의 var 배열
ta 方式, 方式, 但是却很奇怪倪倪倪,
var ta 可仏 方式 可以改变数组元素 피하기, 但是却不是 123?
反汇编结果如下
방법 공개 정적 무효 변화 (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 관리 {// 코드 크기 : 14 바이트 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 : ld_001c : S.S L.S L_0023. 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 { // 코드 크기 : 31 바이트 (들) .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_0015 : LDC.I4.S 11 L_0017 : L_0018 : LDLOC. 0 L_0019 : 호출 void [mscorlib] system.array :: copy ([mscorlib] system.ararray, [mscorlib] system.array, int32) l_001e : ret}结论 !!
int32의 thearray, 实际上应于 c#的可变数目参数, 即 paraams int32 []
这种参数方式是传递的数组馰地地址 (,), 而不是存放数组馰地址的变 변경
加上 var 即加, 修饰饰 odp 修饰饰, 传饰, 是存放数组馰组馰组馰组地组地址?
使 영어, 则在值进进进进进进进进进进进进进进进进进进进进进进进 who, 变数组首地址, 也不改变原组值
加 ODP,,, 迿里还是没看懂是为什什什什么。
c#代码为
public static void 변경 (params int [] a) {a [0] = 0x7b; a = winform.bb;}
|