有如下代码:
تغيير الإجراء (A: صفيف int32) ؛
تغيير الإجراء (var a: صفيف int32) ؛
يكتب
Ta = Array [0..10] من int32 ؛
تغيير الإجراء 2 (A: TA) ؛
تغيير الإجراء 3 (var a: ta) ؛
var
AA: TA ؛
BB: صفيف int32 ؛
التنفيذ
{$ autobox on}
تغيير الإجراء (A: صفيف int32) ؛
يبدأ
A [0]: = 123 ؛
ج: = BB ؛
نهاية؛
تغيير الإجراء (var a: صفيف int32) ؛
يبدأ
A [0]: = 123 ؛
ج: = BB ؛
نهاية؛
تغيير الإجراء 2 (A: TA) ؛
يبدأ
A [0]: = 123 ؛
ج: = BB ؛
نهاية؛
تغيير الإجراء 3 (var a: ta) ؛
يبدأ
A [0]: = 123 ؛
ج: = 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 ؛
تغيير 0 (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 من int32 既可以改变数组的值 ، 又可以改变变傘的榖地址 ، 输出 5678 دقيقة
ta 方式 ، 不能改变数组元素級級級 ، 但是却很奇怪倪倪倪 ،
var ta 方式 可仏 可以改变数组元素 تجنب ، 但是却不是 123؟
反汇编结果如下
طريقة تغيير الفراغ الثابت العام (int32 [] أ) تدار 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 {// 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 { // 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: 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 { // size {code: 31 byte (s) .0 l_0003: ldc.i4 BB L_000B: ldlen l_000d: stelc.0 l_000e: ldarg. 0 l_0019: call void [mscorlib] system.array :: copy ([mscorlib] system.ararray ، [mscorlib] system.array ، int32) l_001e: ret}结论 !!
使 therray of int32 方式 ، 实际上应于 c#的可变数目参数 ، 即 paraams int32 []
这种参数方式是传递的数组馰地地址 (即参数的值) ، 而不是存放数组馰地址的变 التغيير
加上 var 修饰饰 ، 即加 ODP 修饰饰 ، 传饰 ، 是存放数组馰组馰组馰组地组地址؟
使 اللغة الإنجليزية ، 则在值进进进进进进进进进进进进进进进进进进进进进进进 من ، 变数组首地址 ، 也不改变原组值
加 ODP ، 好像传递的是变量身眰址 ، 迿里还是没看懂是为什什什什么。
对应的 C#代码为
تغيير الفراغ الثابت العام (params int [] a) {a [0] = 0x7b ؛ a = winform.bb ؛}
|