Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Странности с foreach


Автор: Rockie 11.8.2008, 11:43
Наверное вопрос больше касается оптимизации кода в .NET. У меня есть программа, которая работает со списками SharePoint. Есть код, написанный и оставленный закоментаченным:
                
Код
                // выведем элементы списков
                //foreach (SPListItem listItem in currentList.Items)
                //{

                //}


Визуально программа работает быстро, доли секунды. Затем я раскомментировал код:

Код
                // выведем элементы списков
                foreach (SPListItem listItem in currentList.Items)
                {

                }


Время работы программы сразу возрастает(3-5 секунд). 

Но ведь этот код не делает ничего  smile 

Почитал про метод foreach. 
http://msdn.microsoft.com/ru-ru/magazine/cc163323.aspx

Как понял, foreach - интересная штука, которая создает некий объект-итератор, позволяет работать с разными коллекциями абстрактно от данных, все это в try/catch.. Вот только непонятно - зачем, ведь в данном случае в моем коде в скобках пусто и ничего не происходит. Что это - плохая оптимизация? Или в .NET надо аккуратно обращаться с foreach?

Автор: Partizan 11.8.2008, 11:48
Rockie, ну а разве не очевидно, что при раскомментаривании этих строк будет выполняться цикл? Или вы думаете, что компилятор соптимизирует этот код и опустит? в релизной версии пробовали? результат тот же?

а вообще недавно дискуссия была по этому поводу:

http://forum.vingrad.ru/topic-223121.html

Автор: nagg 11.8.2008, 11:48
Видемо эта конструкция не расчитана для пустого тела цикла   smile 
используй for 

Автор: Rockie 11.8.2008, 12:05
Partizan, в релизе то же самое. Конечно, imho по хорошему такие блоки надо пропускать.

Цитата(nagg @  11.8.2008,  11:48 Найти цитируемый пост)
Видемо эта конструкция не расчитана для пустого тела цикла  smile  

Похоже в .NET такие конструкции тоже не сворачиваются.  smile 
Код
                for (int i = 0; i < 100000000; i++)
                { 
                }

Автор: mihryak 11.8.2008, 15:47
foreach оптимизировать точно нельзя, даже если тело цикла пустое, т.к. могут происходить какие-либо дополнительные действия при создании энумератора (другое дело, что писать такой код - грех smile)

Автор: Partizan 11.8.2008, 16:11
mihryak, да...я тоже об этом подумал...

Автор: source777 13.8.2008, 12:14
Очевидно, что косяк в глючной реализации класса SPListItem/SPList. Конечно проще списать погрешности своего кривого кода на foreach... Браво!

Добавлено через 3 минуты и 42 секунды
Цитата(Rockie @  11.8.2008,  12:05 Найти цитируемый пост)
Похоже в .NET такие конструкции тоже не сворачиваются. 
Такие конструкции даже в С не сворачиваются, что активно использовалось сишниками для организации временных задержек в стародавние времена, моветон естесвенно, но факт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)