![]() |
#10 |
MCT
|
Читал о следующем
Цитата:
Вы можете пересчитывать ваши коллекции с помощью либо enumerator либо iterator. Когда классы коллекции были впервые представлены в Dynamics AX, iterator это была единственная опция. Но по причине hard-to-find ошибок, был добавлен enumerators, а iterators сохранился для дальнейшей совместимости. Для выявления этих различий, приведен следующий код для пересчета обоими способами.
X++: List list = new List(Types::Integer); ListIterator iterator; ListEnumerator enumerator; ; //Populate list. ... //Traverse using an iterator. iterator = new ListIterator(list); while (iterator.more()) { print iterator.value(); iterator.next(); } //Traverse using an enumerator. enumerator = list.getEnumerator(); while (enumerator.moveNext()) { print enumerator.current(); } Примечание В предыдущих версиях Dynamics AX, эта проблема была более явной так как разработка и тестирование могло происходить в двух уровневой архитектуре, а эта проблема появляется только в трех уровневой архитектуре. Второе отличие между iterators и enumerators это путь, по которому происходит сам пересчет. При использовании iterator, вы должны явно использовать вызов more и next; при использовании enumerator, метод moveNext обрабатывает это сам. Большинство разработчиков получали бесконечный цикл, просто потому что забывали дописать move a pointer. Это не существенная проблема, но иногда это раздражает во время разработки. При постоянном использовании enumerator, вы не столкнетесь ни с одной из этих проблем. Единственная ситуация, в которой следует использовать iterator это удаление элементов из List collection. Следующий код показывает, как это реализовать. X++: List list = new List(Types::Integer); ListIterator iterator; ; list.addEnd(100); list.addEnd(200); list.addEnd(300); iterator = new ListIterator(list); while (iterator.more()) { if (iterator.value() == 200) iterator.delete(); iterator.next(); } print list.toString(); //{100, 300} pause; |
|
|
За это сообщение автора поблагодарили: Dudnik Anton (1). |