为什么List没有更新以及为什么var w总是为null?

时间:2012-07-09 16:40:44

标签: c#

在按钮8中单击事件我做了:

 private void button8_Click(object sender, EventArgs e)
        {
            if (buttonLockMode == true)
            {
                trackBar1.Enabled = true;
                button8.ForeColor = Color.Red;
                button8.Enabled = false;
                textBox1.Text = "Frame Number : " + trackBar1.Value;
                this.trackBar1.Select();
                textBox3.Enabled = true;
                textBox4.Enabled = true;
                wireObjectAnimation1 = new WireObjectAnimation(this, wireObject1);
                int currentFrameIndexRight = trackBar1.Value;
                wireObjectCoordinates1 = new WireObjectCoordinates() { FrameNumber = currentFrameIndexRight };
                WireObjectCoordinatesCloneFrame();

                List<WireObjectCoordinates>  temp = wireObjectAnimation1.CoordinatesList;
                temp.Add(wireObjectCoordinates1);
                //wireObjectAnimation1.CoordinatesList.Add(wireObjectCoordinates1);

                //WireObjectCoordinatesCloneFrame();

            }
            else
            {
                button8.ForeColor = Color.Black;
            }
        }

Phoog我使用了与temp List相同的想法。 在wireObjectanimation中,我做了:

private List<WireObjectCoordinates> _coordinateslist = new List<WireObjectCoordinates>();
        public List<WireObjectCoordinates> CoordinatesList
        {
            get { return _coordinateslist; } 
        }

当我在get行上设置断点时,_coordinateslist和CoordinatesList都为空。

1 个答案:

答案 0 :(得分:1)

如果没有满足谓词的元素,则抛出

First。因此,_coordinatesListFrameNumber等于currentFrameIndex的项目很可能没有。

尝试此操作:将catch更改为catch (Exception e),当执行进入catch块时,使用调试器检查异常。或者,将调试器设置为中断处理的异常,这也使您有机会检查异常。

一旦你确定假设是否为真,即序列中没有满足谓词的元素,你就可以继续下一步,即确定为什么没有满足谓词的元素:要么你的期望是错误的,要么是满足期望的代码是错误的。

这是一个很好的例子,说明为什么你不应该在代码中使用catch { }

如果您遵守代码约定也会有所帮助。像_coordinatesList这样的标识符通常是私有字段; WireObjectCoordinatesList通常是公共财产。你有它倒退,这是令人困惑的。

关于list getter中的断点:

  

我在get上放了一个断点,当我点击button8时它停在那里但是现在List _coordinatesList是空的。如果我将断点放在Form1 button8上单击事件,我会看到List包含点坐标,但是当我在wireObjectanimation类中时,List为空。

考虑以下代码:

private List<string> _words = new List<string>();
public List<string> Words { get { return _words; } }

这个调用代码:

void AddAWord(string word)
{
    this.Words.Add(word);
}

该调用代码与此相同:

void AddAWord(string word)
{
    List<string> temp = this.Words;
    temp.Add(word);
}

换句话说,属性getter首先将列表返回AddAWord,然后AddAWord调用列表中的Add。当你将断点放在属性getter中时,这很可能是列表中没有任何内容的原因。

修改

我并不是说建议添加临时变量可以解决您的问题。相反,临时变量旨在阐明问题发生的原因。添加temp变量不会改变代码的含义。实际上,C#编译器可能会隐式创建临时变量。

也许我误解了你的所作所为以及你所期待的,但对我来说,看起来你的期望是错误的。换句话说,你把你的断点放在错误的一行。

考虑:

1  private List<WireObjectCoordinates> _coordinateslist = new List<WireObjectCoordinates>();  
2  public List<WireObjectCoordinates> CoordinatesList  
3  {  
4      get { return _coordinateslist; } // <<< your breakpoint here
5  }  
6
7  private void button8_Click(object sender, EventArgs e)   
8  {   
9      if (buttonLockMode == true)   
10     {
11         // ...
12         List<WireObjectCoordinates>  temp = wireObjectAnimation1.CoordinatesList; // <<< my breakpoint here
13         temp.Add(wireObjectCoordinates1);
14     }   
15     else   
16     {   
17         // ...

现在逐步完成代码。你在第4行有一个断点。我在第12行添加一个断点。我们首先点击第12行。点击F11。执行移动到第4行,这是您的断点。请注意,列表为空。当然它是空的,因为我们还没有到达第13行。

点击F11几次以完成属性吸气器。执行点返回到第12行。temp变量仍为空。再次按F11将属性值分配给temp变量。执行移至第13行。

再次点击F11。这会调用Add方法。现在该列表包含一个元素。

我的观点是,无论是否存在临时变量,这一系列指令都是相同的。考虑一个单行表达式,如下所示:

wireObjectAnimation1.CoordinatesList.Add(wireObjectCoordinates1);

按以下顺序执行以下步骤:

  • 确定wireObjectAnimation1
  • 引用的对象
  • 调用该对象的CoordinatesList getter
  • 在上一步中Add getter返回的对象上调用CoordinatesList方法

你的断点是第二步; Add在第三步中被调用;因此,当你点击断点时,列表是空的。