63 / 62 / 11
Регистрация: 28.12.2011
Сообщений: 280
|
||||||
1 | ||||||
Использование анонимных методов внутри цикла foreach26.10.2014, 00:30. Показов 1146. Ответов 4
Метки нет (Все метки)
Добрый день, у меня возникла любопытная ситуация, поведение которой я не знаю как объяснить.
В общим есть такая строчка кода.
Кликните здесь для просмотра всего текста
(Filename: C:/BuildAgent/work/d3d49558e4d408f4/artifacts/WebPlayerGenerated/UnityEngineDebug.cpp Line: 53) лоад фото Центр (Filename: C:/BuildAgent/work/d3d49558e4d408f4/artifacts/WebPlayerGenerated/UnityEngineDebug.cpp Line: 53) лоад фото Побережье (Filename: C:/BuildAgent/work/d3d49558e4d408f4/artifacts/WebPlayerGenerated/UnityEngineDebug.cpp Line: 53) лоад фото Пригород (Filename: C:/BuildAgent/work/d3d49558e4d408f4/artifacts/WebPlayerGenerated/UnityEngineDebug.cpp Line: 53) loads Пригород (Filename: C:/BuildAgent/work/d3d49558e4d408f4/artifacts/WebPlayerGenerated/UnityEngineDebug.cpp Line: 53) loads Пригород (Filename: C:/BuildAgent/work/d3d49558e4d408f4/artifacts/WebPlayerGenerated/UnityEngineDebug.cpp Line: 53) loads Пригород (Filename: C:/BuildAgent/work/d3d49558e4d408f4/artifacts/WebPlayerGenerated/UnityEngineDebug.cpp Line: 53) из логов мы видим что 3 раза вызвали 1 метод и передали в качестве аргумента 3 функции, но вызывается только последняя. По моему такого поведения ожидать не стоило? Или как это объяснить?
0
|
26.10.2014, 00:30 | |
Ответы с готовыми решениями:
4
Использование анонимных методов Ошибка при использование цикла foreach Использование методов у объекта в c:forEach JSTL использование цикла Foreach |
26.10.2014, 01:10 | 2 |
Good1101, насколько я помню, в данном типе цикла(foreach) объекты итерации поменять нельзя. Но у вас тут еще и анонимные методы... Думаю дело в цикле. Замените цикл на простой for(...) и проверьте результат.
0
|
63 / 62 / 11
Регистрация: 28.12.2011
Сообщений: 280
|
||||||
26.10.2014, 01:39 [ТС] | 3 | |||||
insite2012, спасибо за ответ, но просто смена на фор не помогла. Полный ответ я нашел вот тут - http://habrahabr.ru/post/141270/ Дело оказалось еще и в том какая версия C# используется, как я понял в 5й версий мой код бы сработал как и ожидалось, но по скольку у меня кажется С# 3.0 то вот так. В итоге я все таки и сделал в for но и там пришлось сделать копию интексатора.
0
|
2735 / 2041 / 380
Регистрация: 22.07.2011
Сообщений: 7,731
|
|
26.10.2014, 01:34 | 4 |
По моему все дело в Load , я так понимаю delegate(Texture2D tx) - функция обратного вызова , которая вызывается асинхронно из отдельного потока , созданного в Load-е. Соответственно , к моменту когда она вызывается , цикл уже завершился , и переменная lid равна его последнему элементу.
И про компилятор Вы верно подметили , вообще инструкции с анонимными методами и захватом переменных могут неожиданным образом разбираться компилятором. В первом случае происходит недетерминированное исполнение , а вот когда Вы присвоили current = i; , компилятор создал уже другую - детерминированную конструкцию: http://rsdn.ru/article/csharp/... .xml#ELHAC - тут как раз ваша история.
0
|
140 / 137 / 22
Регистрация: 16.02.2012
Сообщений: 453
|
|
26.10.2014, 13:20 | 5 |
Просто итерационную переменную нужно занести в отдельную переменную в цикле
var lid1 = lid; и работать с ней. Это особенность анонимных методов.
0
|
26.10.2014, 13:20 | |
26.10.2014, 13:20 | |
Помогаю со студенческими работами здесь
5
Как в связном списке внутри цикла ForEach-Next элемент сделать текущим? Использование методов внутри класса Аргументы консоли, переменные внутри цикла, имена методов и объектов Использование массивов внутри методов класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |