Как это возможно, что переменная впоследствии перезаписывается? - PullRequest
0 голосов
/ 28 ноября 2018

У меня странная проблема с чтением существующих файлов XML.У меня есть файл XML с шагами в качестве элементов.Если в XML есть два шага, я хочу отобразить их в ListBox.

Я построил список из моего XmlDoc:

var myStepList = new Steps(xmlDoc);

Затем я считаю шаги иперейдите к случаю 2, если внутри два шага.

switch (myStepList.amountOfSteps)
        {
            case 1:
                var StepData = myStepList.GetStepData(myStepList.stepList[0]);

                ListBoxSteps.Items.Add(StepData[0].ToString());
                TextBoxStepNo.Text = StepData[1].ToString();
                TextBoxStepColorCode.Text = StepData[2].ToString();
                break;

            case 2:
                var StepData1 = myStepList.GetStepData(myStepList.stepList[0]);

                var StepData2 = myStepList.GetStepData(myStepList.stepList[1]);

                ListBoxSteps.Items.Add(StepData1[0].ToString());
                ListBoxSteps.Items.Add(StepData2[0].ToString());
                TextBoxStepNo.Text = StepData1[1].ToString();
                TextBoxStepNo2.Text = StepData2[1].ToString();
                TextBoxStepColorCode.Text = StepData1[2].ToString();
                TextBoxStepColorCode2.Text = StepData2[2].ToString();
                break;
        }

Когда Stepdata2 определено с правильным содержанием, оно перезаписывает StepData1.Я не знаю почему, потому что прежде чем он имеет правильное содержание.

вот мой класс Шаги:

class Steps
{
    private List<XElement> StepList;

    private readonly XAttribute[] StepData;

    private int AmountOfSteps = 0;

    private readonly int AmountOfStepAttributes = 3;

    public Steps(XmlDoc xmlDoc)
    {
        StepList = xmlDoc.GetStepList();
        StepData = new XAttribute[AmountOfStepAttributes];
    }

    public XAttribute[] GetStepData(XElement step)
    {
        StepData[0] = step.Attribute("name");
        StepData[1] = step.Attribute("stepNo");
        StepData[2] = step.Attribute("colorCode");

        return StepData;
    }

    public List<XElement> stepList
    {
        get { return StepList; }
    }

    public int amountOfSteps
    {
        get
        {
            AmountOfSteps = stepList.Count();

            return AmountOfSteps;
        }            
    }

    public int amountStepAttributes
    {
        get { return AmountOfStepAttributes; }
    }

Это мой класс под названием XmlDoc:

 class XmlDoc 
{
    private List<string> ListFileNames;

    private XDocument XDoc;

    private XAttribute RootAttribute;

    private List<XElement> StepList;

    public XmlDoc()
    {
        StepList = new List<XElement>();
        ListFileNames = new List<string>();
    }

    public List<string> GetXmlFilesList(string path)
    {
        List<string> ListFileNames = new List<string>(Directory.GetFiles(path));

        return ListFileNames;
    }

    public XDocument GetXDoc(string selectedXmlFile)
    {
        XDoc = XDocument.Load(selectedXmlFile);

        return XDoc;
    }

    public XAttribute GetRootAttribute()
    {
        RootAttribute = XDoc.Root.Attribute("No");

        return RootAttribute;
    }

    public List<XElement> GetStepList()
    {
        StepList = XDoc.Root.Elements("Step").ToList();

        return StepList;
    }
}

1 Ответ

0 голосов
/ 28 ноября 2018

Вы используете поля экземпляров в своих классах, когда подойдут локальные переменные.Я сделаю два исправления в Steps, оставлю решение подобных проблем в XmlDoc и других классах для вас:

class Steps
{
    private List<XElement> StepList;

    //Remove this, only needed inside GetStepData
    //private readonly XAttribute[] StepData;

    //Remove this, not needed
    //private int AmountOfSteps = 0;

    private readonly int AmountOfStepAttributes = 3;

    public Steps(XmlDoc xmlDoc)
    {
        StepList = xmlDoc.GetStepList();
    }

    public XAttribute[] GetStepData(XElement step)
    {
        //Create a new array here
        var StepData = new XAttribute[AmountOfStepAttributes];
        StepData[0] = step.Attribute("name");
        StepData[1] = step.Attribute("stepNo");
        StepData[2] = step.Attribute("colorCode");

        return StepData;
    }

    public List<XElement> stepList
    {
        get { return StepList; }
    }

    public int amountOfSteps
    {
        get
        {
            //Just directly return the count
            return stepList.Count();
        }            
    }

    public int amountStepAttributes
    {
        get { return AmountOfStepAttributes; }
    }

Все комментарии в вышеприведенном комментарии должны быть удалены - ониВы просто описываете, что изменилось и почему.

С вашим текущим кодом у вас есть единственный массив, содержащийся в Steps, который перезаписывается при каждом вызове GetStepData.В моем фиксированном коде выше мы выделяем новый массив каждый раз, когда он вызывается, и манипулируем этим массивом до конца вызова этого метода.


Один неочевидный совет дляВы - включите опцию «Рассматривать предупреждения как ошибки» для своих проектов.Простой код не должен генерировать предупреждения, и он должен был отмечать хотя бы одну проблему в вашем XmlDocs классе (что элемент экземпляра ListFileNames инициализирован, но никогда не используется)

Ссылка Оби Эрика Липперта Как отлаживать небольшие программы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...