C#For循环使用uint

时间:2018-04-17 20:18:36

标签: c#

我使用的是Visual Studio 2017和C#。

当我运行此for循环时,它迭代超过0,我变为4294967295

//where loActionList.Count starts at 1
// First time through loop works
// Second time I can see i decrement to 4294967295
// I'm declaring i as uint because loActionList requires it
// and because other vars require it (they are based on an external API)

for (uint i = loActionList.Count - 1; i >= 0; i--)
{
....
}

我可以这样做:

for (int i = (int)loActionList.Count - 1; i >= 0; i--)
{
   IPXC_Action_Goto myvar = (IPXC_Action_Goto)loActionList[(uint)i];
}

...但我想知道是否有另一种方法可以解决这个问题。 也许只是阻止for循环超过0的东西?

已解决:我最终使用@ RonBeyer建议使用此代码if (i == 0) break;添加中断。

2 个答案:

答案 0 :(得分:4)

要了解此问题,让我们看看for循环与常规int

int i;
for(i = 5; i >= 0; i--) {
  Console.Write(i);
}

运行它,你会得到543210,因为你期待。

但是,如果您现在输出i,则会获得-1。它停止了,因为在制作i = -1之后,它检查了-1 >= 0,然后看到它是false并已中止。

uint(无符号整数)的问题是0 - 1上的uint给出了它的最大值,因为它包裹回来。完成0 - 1之后,它会检查并BIG_NUMBER_HERE >= 0是真的,所以它会继续。

有几种简单的方法可以避免这种情况。您使用的具体取决于您的使用案例/个人品味:

  • 使用int代替uint
  • 将您的起始值提高1,然后以> 0结束
  • 让您的条件i >= 0 && i < BIG_NUMBER_HERE
  • if (i == 0) break;循环结束时添加for,如果您已达到零,则强制退出(感谢Ron Beyer)。

BIG_NUMBER_HERE将是uint最大值。它在这里和那里如何得到这个数字是不同的,但是如果你需要的话,应该有一个常数可以给你这个数字。

答案 1 :(得分:1)

如果您遇到问号问题,但需要uint的基数,我建议您坚持使用。

如果API需要特定的数据类型,例如uint,我会为每次调用投放它,以尽量减少对代码的损害。

for (var i = loActionList.LongCount() - 1; i >= 0; i--)
{
   IPXC_Action_Goto myvar = (IPXC_Action_Goto)loActionList[(uint)i];
}