17.08.2011, 10:35 | #1 |
Сам.AX
|
Параметры и табличные переменные
В книге MorphX IT (в русском варианте, стр.стр.133,136) написано:
Цитата:
Если передается временная таблица в качестве параметра в метод и параметр изменяется в методе, то значение параметра тоже меняется... Отметьте, что только временные таблицы передаются по ссылке. Обычная таблица, как CustTable, будет передаваться по значению
__________________
ѣ |
|
|
За это сообщение автора поблагодарили: S.Kuskov (3). |
17.08.2011, 11:03 | #2 |
Участник
|
Вопрос в том что понимать под "... и параметр изменяется в методе".
X++: static void JobTestCommonParameter(Args _args) { CustTable CustTable; void testMethod(CustTable _CustTable) { CustTable CustTable2; ; CustTable2.clear(); _CustTable = CustTable2; } ; select CustTable; info(CustTable.AccountNum); testMethod(CustTable); info(CustTable.AccountNum); } В книге написано, что если передавать в метод ссылку на "временный" common, то ссылка (табличная переменная) будет передана по ссылке Что такое изменение табличной переменной? Это присваивание ссылки на другой объект или обнуление ссылки Последний раз редактировалось S.Kuskov; 17.08.2011 в 11:10. |
|
17.08.2011, 11:18 | #3 |
Сам.AX
|
Цитата:
X++: static void JobTestCommonParameter(Args _args) { CustTable custTable; void testMethod(CustTable _custTable) { _custTable.clear(); } select custTable; info(custTable.AccountNum); testMethod(custTable); info(custTable.AccountNum); } Может, все-таки, я чего-то не догоняю?
__________________
ѣ |
|
17.08.2011, 11:25 | #4 |
Сам.AX
|
Изменив первый джоб еще немного:
X++: void testMethod(CustTable _custTable)
{
CustTable custTable2;
custTable2 = _custTable;
custTable2.clear();
}
__________________
ѣ |
|
17.08.2011, 11:39 | #5 |
Участник
|
"немного поменяв код" вы меняете порядок присвоения значений, а значит и результат
|
|
17.08.2011, 11:40 | #6 |
Сам.AX
|
В общем, смысл я понял И по вашему оно действительно работает как и сказано (для временной и обычной по разному), но я ориентировался на пример из книги:
X++: void callByReference(TmpAccountSum _tmpAccountSum) { TmpAccountSum tmpAccountSum; ; tmpAccountSum = _tmpAccountSum; select firstonly tmpAccountSum order by accountNum desc; { info(tmpAccountSum.accountNum); } }
__________________
ѣ |
|
17.08.2011, 11:43 | #7 |
Участник
|
На самом деле у меня не получилось найти то действие которое бы изменяло/не изменяло параметр по разному для временных/постоянных таблиц. Так что я тоже в замешательстве. Что именно имелось в виду в книге не понятно
|
|
17.08.2011, 11:52 | #8 |
Сам.AX
|
Цитата:
X++: static void JobTestCommonParameter(Args _args) { _TmpTable tmpTable; void testMethod(_TmpTable _tmpTableParm) { _tmpTableParm = null; } ttsbegin; tmpTable.selectForUpdate(); tmpTable.NumberOf = 1; tmpTable.insert(); ttscommit; select tmpTable; info(strfmt("%1",tmpTable.NumberOf)); testMethod(tmpTable); info(strfmt("%1",tmpTable.NumberOf)); }
__________________
ѣ |
|
17.08.2011, 11:59 | #9 |
Участник
|
Цитата:
Сообщение от maximka
В общем, смысл я понял И по вашему оно действительно работает как и сказано (для временной и обычной по разному), но я ориентировался на пример из книги:
X++: void callByReference(TmpAccountSum _tmpAccountSum) { TmpAccountSum tmpAccountSum; ; tmpAccountSum = _tmpAccountSum; select firstonly tmpAccountSum order by accountNum desc; { info(tmpAccountSum.accountNum); } } X++: tmpAccountSum.setTmpData(_tmpAccountSum); Последний раз редактировалось ice; 17.08.2011 в 12:02. |
|
17.08.2011, 12:01 | #10 |
Участник
|
|
|
17.08.2011, 12:11 | #11 |
Сам.AX
|
Сорри. Лажанулся (прогнал другой пример ). Пора в отпуск.
__________________
ѣ Последний раз редактировалось maximka; 17.08.2011 в 12:15. |
|
17.08.2011, 12:14 | #12 |
Сам.AX
|
Так работает как и должно, ибо никаких ссылок не используется. Вопрос-то в том, что автор книги говорит о разном поведении системы для временной и обычной таблиц при передаче их через параметры. Чего я не смог повторить.
__________________
ѣ |
|
19.08.2011, 08:27 | #13 |
Участник
|
Цитата:
А вот использование setTmpData() - это как раз таки передача ссылки на временную таблицу. Причем, tmpAccountSum окажется на той же строне, что и _tmpAccountSum, но значения в этих переменных будут независимы (с привязкой к одной и той же временной таблице, естественно). Передать данные из временной таблицы на другую строну можно только последовательным копированием и вставкой.
__________________
Axapta v.3.0 sp5 kr2 |
|
19.08.2011, 09:37 | #14 |
Участник
|
Мне кажется, что всё станет на свои места если до конца разобраться, в том что всётаки представляет из себя табличная переменная в аксапте?
Табличная переменная содержит либо ссылается на
Если обсуждать вопрос копирования табличной переменной, то нужно разобраться в том, что из вышеперечисленного является ссылкой, а что значением. Ведь Цитата:
Часто некоторые на форумах повторяют миф:
Миф: Объекты передаются по ссылке, а примитивы по значению. ... Истина же...: Истина 1: Всё в Java передается по значению. Объекты, же, вообще никогда не передаются Истина 2: Значениями переменных могут быть только примитивы или ссылки, но не объекты. Если говорить о том, что в Axapta как и Java всё передается по значению, то тогда, что имел в виду автор MorphX IT, когда писал Цитата:
Отметьте, что только временные таблицы передаются по ссылке. Обычная таблица, как CustTable, будет передаваться по значению
P.S.: некоторые известные мне проблемы/ньюансы при работе с табличными переменными |
|
19.08.2011, 12:24 | #15 |
Сам.AX
|
"If a temporary table is passed as a parameter to a method, and the temporary table parameter is modified in the method, the calling variable will also be changed... Note that only temporary tables are called by reference. A normal table like CustTable would be called by value"
__________________
ѣ |
|
|
|