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);
}
除非以多线程的方式访问/操作计数器,否则这应该是一个不可能的状态。
你可以尝试赋值&检查在一个地方:
var index = 0;
if ((index = (counter - 1)) > 0)
{
Lights[index].setState(0);
}
如果这是一个单线程应用程序,没有任何其他代码改变counter
,那么最可能的解释是Lights
不够长。例如,如果counter
是1
(我想你会同意,> 0
-所以if
测试将通过),Lights
是零长度数组,那么Lights[i]
(Lights[0]
)将引发此异常-或者如果counter
是200
,但Lights.Length
是199
(或更少)-因为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语句本身为假。
这个问题已经通过减少事件触发次数得到了解决。