|
8 / 8 / 0
Регистрация: 02.09.2013
Сообщений: 131
|
|||||||||||
Создание объектов в цикле10.11.2017, 09:32. Показов 9910. Ответов 15
Метки нет (Все метки)
Всем привет! Ребят, помогите мне вразумить следующую ситуацию. Попался мне код, в котором создаются объекты в цикле! Я сразу подумал, что будет ошибка, ведь создаются объекты с одинаковым именем, а так нельзя же.. В том коде реализована многопоточность, то есть на каждой итерации создается объект класса и в отдельный поток выносится его метод с последующим запуском. Для простоты вопроса приведу облегченный код без лишних смысловых нагрузок.
Я в недоумени... причем, когда объекты созданы в цикле, они все живут до конца выполнения программы, то есть, каждый новосозданный не заменяет предыдущий... Как это всё выглядит? Помогите понять... И как обратиться после цикла к какому-то из созданных объектов? Ведь я вижу одно имя для всех, а это скорее всего не так..
0
|
|||||||||||
| 10.11.2017, 09:32 | |
|
Ответы с готовыми решениями:
15
События для объектов в цикле в цикле создать несколько объектов с разными именами |
|
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
|
|||||||
| 10.11.2017, 09:36 | |||||||
0
|
|||||||
|
20 / 36 / 14
Регистрация: 08.10.2015
Сообщений: 406
|
||
| 10.11.2017, 09:37 | ||
|
Но вот i тоже определяется на каждой итерации.
0
|
||
|
8 / 8 / 0
Регистрация: 02.09.2013
Сообщений: 131
|
||
| 10.11.2017, 09:44 [ТС] | ||
0
|
||
|
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
|
|
| 10.11.2017, 09:48 | |
|
EveKS, тут видимо вопрос был, почему в цикле можно множество раз объявлять и инициализировать переменную с одним и тем же именем, а вне цикла нет.
Имхо, я думаю это фича такая компилятора.. во время итерации повторное объявление отбрасывается.. Добавлено через 2 минуты PaskalisT, ни как, он удалился имхо..
0
|
|
|
8 / 8 / 0
Регистрация: 02.09.2013
Сообщений: 131
|
||||
| 10.11.2017, 09:53 [ТС] | ||||
|
Добавлено через 4 минуты
0
|
||||
|
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
|
|
| 10.11.2017, 09:56 | |
|
PaskalisT, ничего подобного, в цикле происходит повторная инициализация
1
|
|
|
8 / 8 / 0
Регистрация: 02.09.2013
Сообщений: 131
|
||
| 10.11.2017, 13:03 [ТС] | ||
|
0
|
||
|
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,303
|
||||
| 10.11.2017, 13:26 | ||||
|
1
|
||||
|
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
|
||
| 10.11.2017, 14:22 | ||
|
Добавлено через 1 минуту PaskalisT, дайте живой пример на потоках, чего на кофейной гуще гадать..
0
|
||
|
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,303
|
|
| 10.11.2017, 14:33 | |
|
worldown, нет, он это делает, когда:
а) забивается нулевое поколение в куче; б) его явно попросят (GC.Collect()); в) ОС не хватает памяти;
0
|
|
|
189 / 177 / 111
Регистрация: 22.06.2009
Сообщений: 533
|
|
| 10.11.2017, 14:45 | |
|
Usaga, Да нет, это я понимаю, спасибо.. Я имел ввиду в контексте вопроса, в общем не понимаю причем тут сборщик мусора и вопрос автора..
Я без сарказма. Хочу просто понять что хочет понять автор вопроса? ) почему на выводе в цикле нет "hellohellohello..." ?
0
|
|
|
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,303
|
|
| 10.11.2017, 14:48 | |
|
worldown, автор вопроса удивляется почему объект не "пропадает" сразу же, как переписывается ссылка. Т.е. для него ссылка и сам объект - одно и то же.
Я же упомянул про сборщик в контексте того, что именно он отвечает за уборку, а не "оно само исчезает" как только ссылка переписывается и что GC уборку делает по своим правилам, а несётся всё тут же убирать, как скорая помощь.
1
|
|
|
[Bicycle Reinventor]
|
|||||||||||||||||
| 10.11.2017, 15:04 | |||||||||||||||||
|
Например, код:
Если, как Вы говорите, переписать тот же for повтором одинаковых кусков кода, то блоков кода будет меньше, а область видимости общая:
Сравните:
Так что for не просто "тупо повторяет один и тот же кусок кода несколько раз", он создаёт вложенный блок кода, для которого работают те же правила области видимости переменных, как и для любых других. И как правильно отметил Usaga, переменная в данном случае всегда одна, просто она переинициализируется на каждой итерации цикла.
1
|
|||||||||||||||||
|
8 / 8 / 0
Регистрация: 02.09.2013
Сообщений: 131
|
|||||||||||
| 10.11.2017, 15:19 [ТС] | |||||||||||
|
Я никогда не задумывался о циклах так серьезно. Ну да, они повторяют код определенное, по условию или значению, количество раз, но не более.. Работать с ними умею неплохо, со всему видами. Но сегодня ситуация с инициализацией переменных и объектов ввела меня в ступор. Ладно бы просто присваивалось новое значение переменной, но тут полностью она объявляется на каждой итерации. А, как я помню, в рамках одного контекста можно объявить поле только один раз.
Тело цикла и есть отдельный контекст и в нём на каждой итерации объявляется переменная..... Допустим, так можно только в циклах сделать, тогда мне нужно понять как это происходит, как это реализуется вне цикла(написать вручную повтор кода) что случается с объектами, созданными ранее? Мне сейчас в голову пришло этому такое объяснения, поправьте меня, если я ошибаюсь: Допустим, есть цикл:
Создается прослушиватель подключений клиентов client. Есть класс clientObject, взаимодействующий с клиентами в методе process. Этод метод вызывается в дополнительном потоке clientThread. Вот... Повторюсь, что меня смутило - создание объектов с одинаковым именем в одном контексте, вопросы - что происходит с созданными объектами и как вообще представить тоже самое вне цикла, то есть, вручную переписать код... И тут я подумал... Известно, что блок кода имеет отдельную область видимости(контекст), тогда, наверное, тело цикла можно представить как блок кода и, соответственно, количество итераций как количество таких блоков. Например,выше описанный цикл можно представить:
Я правильно всё проанализировал? Добавлено через 1 минуту я пока все описал, не заметил много ответов)) Добавлено через 2 минуты Exerion, я получается использовал основу вашего ответа, еще его не прочитав)))
0
|
|||||||||||
|
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,303
|
|||||
| 11.11.2017, 05:52 | |||||
|
а) выход из области видимости не вызывает мгновенное уничтожение объектов ссылки на которые были потеряны; б) CLR знает потоки "в лицо" (хранит ссылки) и не трогает их даже, когда в вашем коде уже не осталось ссылок на объекты Thread\Task и пришло время убирать мусор; Выражатеся это в том, что если вы, к примеру, в каком-то методе создадите объект таймера и запустите его, то он продолжит работать и после выхода из метода (с учётом, что ссылок на него не осталось), но до первой сборки мусора (на самом деле останутся живы все объекты, просто по таймеру это будет явно видно). Потоки же переживут любое количество сборок мусора.
0
|
|||||
| 11.11.2017, 05:52 | |
|
Помогаю со студенческими работами здесь
16
Как менять свойства сразу нескольких объектов в цикле?
Создание переменной в цикле Создание кнопок в цикле Создание потоков в цикле Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
в-строка - входное арифметическое выражение в инфиксной(обычной). . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|