0

在按钮 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 我使用了与临时列表相同的想法。在wireObjectanimation中我做了:

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

而且当我在获取行上放置断点时,_coordinateslist 和 CoordinatesList 都是空的。

4

1 回答 1

1

First如果没有满足谓词的元素,则抛出。因此,在 which 中很可能没有_coordinatesList项目FrameNumber等于currentFrameIndex

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

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

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

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

关于列表 getter 中的断点:

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

考虑这段代码:

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 变量旨在阐明问题发生的原因。添加 temp 变量不会改变代码的含义。事实上,C# 编译器很可能会隐式创建 temp 变量。

也许我误解了你的所作所为和你的期望,但在我看来,你的期望是不正确的。换句话说,您将断点放在了错误的行上。

考虑:

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
  • 在上一步getterAdd返回的对象上调用方法CoordinatesList

您的断点在第二步;Add在第三步调用;因此,当您命中断点时,该列表为空。

于 2012-07-09T17:40:56.163 回答