Войти

Показать полную графическую версию : Перекрытие области видимости в цикле foreach


Delirium
14-09-2010, 09:00
Имеем такой кусочек кода:
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
С областью видимости всё в силе: вне 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
Если с XML вариантом так не происходит, и значения из предыдущего цикла добавляются в TreeView, то можно посчитать что это баги при использовании с XML. »
Совершенно верно, не происходит :) И самое неприятное, что данный баг можно выловить только при внимательной пошаговой отладке :)




© OSzone.net 2001-2012