有如下代码:
Изменение процедуры (A: массив Int32);
ПРОЦЕДУРА ИЗМЕНЕНИЕ0 (var a: массив Int32);
Тип
ta = массив [0..10] из Int32;
ПРОЦЕДУРА ИЗМЕНЕНИЕ2 (A: TA);
Процедура изменение3 (var a: 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 мин.
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 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 изменение 2 (int32 [] a) Cil Managed { // Размер кода: 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_001C: LD_001C: L_001A: LD_001B: LD_001C: LD_001C: 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 изменение 3 (int32 [] & a) Cil Managed { // Размер кода: 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: Call void [mscorlib] System.Array :: Copy ([[mscorlib] System.Ararray, [mscorlib] System.Array, Int32) L_001E: ret}结论 !!
使 Thearray of Int32 方式, 实际上应于 C#的可变数目参数, 即 Paraams int32 []
这种参数方式是传递的数组馰地地址 (即参数的值), 而不是存放数组馰地址的变 Изменение
加上 var 修饰饰, 即加 Odp 修饰饰, 传饰, 是存放数组馰组馰组馰组地组地址?
使 Английский, 则在值进进进进进进进进进进进进进进进进进进进进进进进 Кто, 变数组首地址, 也不改变原组值
加 ODP, 好像传递的是变量身眰址, 迿里还是没看懂是为什什什什么。
对应的 C#代码为
Общественное статическое изменение пустоты (Params int [] a) {a [0] = 0x7b; A = winform.bb;}
|