![]() |
#1 |
Сам.AX
|
Параметры и табличные переменные
В книге MorphX IT (в русском варианте, стр.стр.133,136) написано:
Цитата:
Если передается временная таблица в качестве параметра в метод и параметр изменяется в методе, то значение параметра тоже меняется... Отметьте, что только временные таблицы передаются по ссылке. Обычная таблица, как CustTable, будет передаваться по значению
__________________
ѣ |
|
|
За это сообщение автора поблагодарили: S.Kuskov (3). |
![]() |
#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. |
|
![]() |
#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); } Может, все-таки, я чего-то не догоняю? ![]()
__________________
ѣ |
|
![]() |
#4 |
Сам.AX
|
Изменив первый джоб еще немного:
X++: void testMethod(CustTable _custTable)
{
CustTable custTable2;
custTable2 = _custTable;
custTable2.clear();
}
__________________
ѣ |
|
![]() |
#5 |
Участник
|
"немного поменяв код" вы меняете порядок присвоения значений, а значит и результат
|
|
![]() |
#6 |
Сам.AX
|
В общем, смысл я понял
![]() X++: void callByReference(TmpAccountSum _tmpAccountSum) { TmpAccountSum tmpAccountSum; ; tmpAccountSum = _tmpAccountSum; select firstonly tmpAccountSum order by accountNum desc; { info(tmpAccountSum.accountNum); } }
__________________
ѣ |
|
![]() |
#7 |
Участник
|
На самом деле у меня не получилось найти то действие которое бы изменяло/не изменяло параметр по разному для временных/постоянных таблиц. Так что я тоже в замешательстве. Что именно имелось в виду в книге не понятно
|
|
![]() |
#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)); }
__________________
ѣ |
|
![]() |
#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. |
|
![]() |
#10 |
Участник
|
|
|
![]() |
#11 |
Сам.AX
|
Цитата:
![]()
__________________
ѣ Последний раз редактировалось maximka; 17.08.2011 в 12:15. |
|
![]() |
#12 |
Сам.AX
|
Так работает как и должно, ибо никаких ссылок не используется. Вопрос-то в том, что автор книги говорит о разном поведении системы для временной и обычной таблиц при передаче их через параметры. Чего я не смог повторить.
__________________
ѣ |
|
![]() |
#13 |
Участник
|
Цитата:
![]() А вот использование setTmpData() - это как раз таки передача ссылки на временную таблицу. Причем, tmpAccountSum окажется на той же строне, что и _tmpAccountSum, но значения в этих переменных будут независимы (с привязкой к одной и той же временной таблице, естественно). Передать данные из временной таблицы на другую строну можно только последовательным копированием и вставкой.
__________________
Axapta v.3.0 sp5 kr2 |
|
![]() |
#14 |
Участник
|
Мне кажется, что всё станет на свои места если до конца разобраться, в том что всётаки представляет из себя табличная переменная в аксапте?
Табличная переменная содержит либо ссылается на
Если обсуждать вопрос копирования табличной переменной, то нужно разобраться в том, что из вышеперечисленного является ссылкой, а что значением. Ведь Цитата:
Часто некоторые на форумах повторяют миф:
Миф: Объекты передаются по ссылке, а примитивы по значению. ... Истина же...: Истина 1: Всё в Java передается по значению. Объекты, же, вообще никогда не передаются Истина 2: Значениями переменных могут быть только примитивы или ссылки, но не объекты. Если говорить о том, что в Axapta как и Java всё передается по значению, то тогда, что имел в виду автор MorphX IT, когда писал Цитата:
Отметьте, что только временные таблицы передаются по ссылке. Обычная таблица, как CustTable, будет передаваться по значению
P.S.: некоторые известные мне проблемы/ньюансы при работе с табличными переменными |
|
![]() |
#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"
__________________
ѣ |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|