在按钮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都为空。
答案 0 :(得分:1)
First
。因此,_coordinatesList
中FrameNumber
等于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
在第三步中被调用;因此,当你点击断点时,列表是空的。