Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Перекрытие области видимости в цикле foreach (http://forum.oszone.net/showthread.php?t=185395)

Delirium 14-09-2010 09:00 1494920

Перекрытие области видимости в цикле foreach
 
Имеем такой кусочек кода:
Код:

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 по другому считается область видимости переменных или это какой то баг?

Admiral 17-09-2010 16:25 1497870

С областью видимости всё в силе: вне 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.

Delirium 18-09-2010 02:06 1498269

Цитата:

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

Совершенно верно, не происходит :) И самое неприятное, что данный баг можно выловить только при внимательной пошаговой отладке :)


Время: 21:34.

Время: 21:34.
© OSzone.net 2001-