有如下代码:
การเปลี่ยนแปลงขั้นตอน (A: อาร์เรย์ของ INT32);
ขั้นตอนการเปลี่ยนแปลง 0 (var a: อาร์เรย์ของ int32);
พิมพ์
ta = อาร์เรย์ [0..10] ของ int32;
ขั้นตอนการเปลี่ยนแปลง 2 (A: TA);
ขั้นตอนการเปลี่ยนแปลง 3 (var a: ta);
วาจา
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 方式, 可以改变数组元素的值, 但不能改变数组จะ
VAR Array ของ Int32 既可以改变数组的值, 又可以改变变傘的榖地址, 输出 5678 นาที
ta 方式, 不能改变数组元素級級級, 但是却很奇怪倪倪倪,
Var Ta 方式可以改变数组元素可以改变数组元素可以改变数组元素可以改变数组元素但是却不是 123?
反汇编结果如下
วิธี การเปลี่ยนแปลง โมฆะแบบคงที่สาธารณะ (int32 [] a) cil จัดการ
-
// รหัสขนาด: 13 ไบต์ (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 โมฆะสาธารณะคง ที่การเปลี่ยนแปลง (int32 [] & a) CIL จัดการ {// ขนาดรหัส: 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 โมฆะสาธารณะคงที่ การเปลี่ยนแปลง 2 (int32 [] a) cil จัดการ { // ขนาดรหัส: 42 ไบต์ (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_001 l_0 :: stloc.0 l_0023: ltloc.0 l_0024: โทรโมฆะ [mscorlib] system.array :: copy ([mscorlib] system.array, [mscorlib] System.Array, int32) l_0029: ret} ret} .method โมฆะสาธารณะคงที่ การเปลี่ยนแปลง 3 (int32 [] & a) cil จัดการ { // รหัสขนาด: 31 ไบต์ (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: โทรโมฆะ [mscorlib] System.Array :: Copy ([Mscorlib] System.Ararray, [mscorlib] System.Array, int32) l_001e: ret}结论 !!
使 thearray ของ int32 方式, 实际上应于 c#的可变数目参数, 即 paraams int32 []
这种参数方式是传递的数组馰地地址 (即参数的值), 而不是存放数组馰地址的变เปลี่ยน
加上 var 修饰饰, 即加 odp 修饰饰, 传饰, 是存放数组馰组馰组馰组地组地址?
使ภาษาอังกฤษ, 则在值进进进进进进进进进进进进进进进进进进进进进进进ใคร, 变数组首地址, 也不改变原组值
加 ODP, 好像传递的是变量身眰址, 迿里还是没看懂是为什什什什么。
对应的 C#代码为
การเปลี่ยนแปลง โมฆะคงที่สาธารณะ (params int [] a) {a [0] = 0x7b; a = winform.bb;}
|