c#正在使用false if语句

本文关键字:false if 语句 | 更新日期: 2023-09-27 18:14:41

SOLVED:代码每10毫秒通过事件执行一次,增加了解决问题的事件之间的时间间隔。

我正在经历一个不应该发生的奇怪的IndexOutOfRangeException。if语句中的代码正在被使用,即使语句本身是"false"。这是已知的问题吗?如果是这样,我该如何解决这个问题?

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

代码:

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

c#正在使用false if语句

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

你可以尝试赋值&检查在一个地方:

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

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

检查Lights.Length

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

尝试在访问Lights的元素之前检查它的长度

试试

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

计时器每10ms触发一次事件。这就产生了这样的可能性:

  • 在事件a期间进入if语句的程序。
  • 一个新的事件B被触发,CPU处理事件B
  • 事件B将计数器更改为负值,从而使if语句为假。
  • CPU改变来处理事件a
  • 程序现在在if语句中,即使if语句本身为假。

这个问题已经通过减少事件触发次数得到了解决。