如果正在使用语句,则为C#false

时间:2013-05-21 08:46:23

标签: c# if-statement runtime-error

解决:代码每10毫秒通过事件进行一次,从而增加了事件解决问题所需的时间。

我遇到了一个不应该发生的奇怪的IndexOutOfRangeException。即使语句本身是'false',也会使用if语句中的代码。这是一个已知的问题吗?如果是这样,我该如何解决这个问题?

当计数器(int)为0时发生错误,因此从element -1灯请求array

代码:

 if (counter  > 0)
    {
    Console.WriteLine("counter-1 is groter dan 0");
    int i = counter - 1;
    Lights[i].setState(0);
    }

5 个答案:

答案 0 :(得分:1)

除非以多线程方式访问/操作计数器 - 否则这应该是一个不可能的状态。

你可以随时尝试完成作业和在一个地方办理入住手续:

 var index = 0;

 if ((index = (counter - 1))  > 0)
 {
    Lights[index].setState(0);
 }

答案 1 :(得分:1)

如果这是一个单线程应用程序而没有任何其他代码变异counter,那么最可能的解释是Lights根本不够长。例如,如果counter1(我认为您同意,> 0 - 那么if测试将通过),Lights是一个零长度数组,然后Lights[i]Lights[0])会引发此异常 - 或counter200Lights.Length199 (或更少) - 由于Lights[i]Lights[199])超出了范围0 - 198

检查Lights.Length

答案 2 :(得分:0)

如果后台没有其他线程更改counter,那么唯一可能的解释是Lights[]集合的大小为零。

在访问其元素之前,请尝试检查Lights的长度。

答案 3 :(得分:0)

试试这个

int i=0;
if (counter  > 0)
{
 Console.WriteLine("counter-1 is groter dan 0");
 i = counter - 1;
 Lights[i].setState(0);
}

答案 4 :(得分:0)

计时器每10ms触发一次事件。这创造了以下的可能性:

  • 程序在事件A中进入if语句。
  • 新事件B被触发,CPU负责事件B.
  • 事件B将计数器更改为负值,从而使if语句变为false。
  • CPU更改为处理事件A。
  • 即使if语句本身是假的,程序现在也在if语句中。

通过减少事件发生频率来解决问题。