2012-07-09 108 views
0

在按钮8单击事件我所做的:为什么列表不更新,为什么var w始终为空?

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; } 
     } 

而且还当我把一个断点的get线_coordinateslist和CoordinatesList两空。

+8

这是很多要求某人审查的代码。你能否将这个问题归结为核心问题? – 2012-07-09 16:43:43

+0

你的问题几乎是不可读的。也许你应该编辑它,让它更清晰 – YavgenyP 2012-07-09 16:43:55

+0

你可以给一个SSCCE,简短,自包含正确的例子吗? – 2012-07-09 16:46:31

回答

1

First如果没有元素满足谓词,则抛出。由此可见,_coordinatesList中很可能没有FrameNumber等于currentFrameIndex的物品。

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

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

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

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

关于列表吸气断点:

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

考虑以下代码:

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); 
} 

换句话说,财产获得者首先返回列表AddAWord,然后AddAWord在列表上调用Add。当你将断点放在属性获取器中时,Thet很可能是列表中没有包含任何东西的原因。

编辑

我不是这个意思表明,添加一个临时变量将解决您的问题。而是,临时变量旨在阐明问题发生的原因。添加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吸气该对象
  • 上确定所引用的对象
  • 对上一步中由CoordinatesList吸气剂返回的对象调用Add方法

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

+0

Phoog我将编辑我的问题,并缩短它,并告诉你我做了什么,并改变仍然无法正常工作。 – user1477444 2012-07-09 18:36:59

+0

@ user1477444对不起,响应缓慢;这周我一直很忙。我编辑了我的答案以解决您编辑的问题。 – phoog 2012-07-11 19:49:40

相关问题