Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Перекрытие области видимости в цикле foreach

Ответить
Настройки темы
.NET - Перекрытие области видимости в цикле foreach

Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Имеем такой кусочек кода:
Код: Выделить весь код
XmlDocument doc = new XmlDocument();
            XmlDocument docTemplate = new XmlDocument();
            try
            {
                doc.Load("LocalUsers.xml");
                TreeNode t1;
                foreach (XmlNode node in doc.SelectNodes("//Computer"))
                {
                    t1 = new TreeNode(node.Attributes["Name"].Value);
                    treeAll.Nodes[0].Nodes.Add(t1);

                }
                treeAll.Nodes[0].ExpandAll();
            }
            catch { }
            
            try
            {
                docT.Load("Template.xml");
                TreeNode tt;
                foreach (XmlNode node in docTemplate.SelectNodes("//UserName"))
                {
                    tt = new TreeNode(node.InnerText);
                    treeTemplate.Nodes.Add(tt);

                }
                treeTemplate.Nodes[0].ExpandAll();
            }
            catch { }
Суть проста - имеется 2 TreeView, которые заполняются данными из XML. Заметил одну непонятку:
Цикл
Код: Выделить весь код
XmlNode node in doc.SelectNodes("//Computer")
Согласно области видимости, переменная node должна видиться только в пределах первого цикла foreach и после окончания работы цикла переменная уничтожается.
Но на самом деле, если использовать приведенный выше код, то увидим, что во втором цикле foreach переменная node уже имеет значения из первого цикла (значение Computer вместо UserName. Заменим название переменной во втором коде на node2 все работает без проблем.

И, собственно, вопрос - в цикле foreach по другому считается область видимости переменных или это какой то баг?

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 09:00, 14-09-2010

 

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


С областью видимости всё в силе: вне foreach переменная не видима. Предположение: другое дело что компилятор"увидев" знакомую "картину" решает не списывать переменную. Возможно с помощью Garbage Collector данную ситуацию можно отрегулировать.
Более простой пример
Код: Выделить весь код
using System;

class Some
{
    public static new void Main()
    {
        int[] a = new int[] { 1, 2, 3 };
        int[] b = new int[] { -1, -2, -3 };
        foreach (int i in a)
        {
            System.Console.WriteLine(i);
        }
        foreach (int i in b)
        {
            System.Console.WriteLine(i);
        }
    }
}
В отладчике i приходит ко второму foreach действительно как 3 (на чём и закончился предыдущий цикл), но второй раз печать 3 не станет, так как сразу же будет присвоено -1.

Если с XML вариантом так не происходит, и значения из предыдущего цикла добавляются в TreeView, то можно посчитать что это баги при использовании с XML.

Отправлено: 16:25, 17-09-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Цитата Admiral:
Если с XML вариантом так не происходит, и значения из предыдущего цикла добавляются в TreeView, то можно посчитать что это баги при использовании с XML. »
Совершенно верно, не происходит И самое неприятное, что данный баг можно выловить только при внимательной пошаговой отладке

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 02:06, 18-09-2010 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » .NET - Перекрытие области видимости в цикле foreach

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Обработать два текстовых файла в одном цикле: как? grinsen Скриптовые языки администрирования Windows 1 27-02-2010 03:33
Разное - wi-fi и 3 метра вне прямой видимости Bright Прочее железо 1 11-05-2009 14:22
FreeBSD - Перекрытие конфигов POSTFIX kryo Общий по FreeBSD 2 12-11-2008 11:39
Повтор в цикле команды XCopy babki Программирование и базы данных 6 29-11-2005 10:22
Перекрытие flash’ом слоя div, параметр z-index не помогает. Irlon Вебмастеру 6 18-11-2005 18:13




 
Переход