我应该在C#中使用uint来获取不能为负的值吗?

时间:2010-01-06 13:17:13

标签: c# integer

我刚刚尝试实现一个类,其中有许多长度/计数属性等uint而不是int。然而,在这样做的同时,我注意到这样做真的很痛苦,好像没有人真的想要这样做。

几乎所有提出整数类型的东西都会返回int,因此需要在几个点上进行强制转换。我想构造一个StringBuffer,其缓冲区长度默认为该类中的一个字段。也需要演员。

所以我想知道我是否应该在这里恢复int。无论如何,我当然不会使用整个范围。我只是想,因为我正在处理那里只是不能是负面的(如果它是,这是一个错误)实际使用{{1}是个好主意}。

PS:我看到了this question,这至少解释了为什么框架本身总是使用uint,但即使在自己的代码中,坚持int实际上也很麻烦,这让我觉得它很明显并不是真的想要。

8 个答案:

答案 0 :(得分:57)

我还将其他答案添加到使用uint作为公共字段,属性,方法,参数等类型,这违反了公共语言规范规则,并在可能的情况下予以避免。

答案 1 :(得分:40)

虽然严格来说你应该使用uint来保存包含非负整数的变量,但是你会遇到其中一个并不总是切实可行的原因。

在这种情况下,我不认为必须进行强制转换所带来的可读性降低是值得的。

答案 2 :(得分:4)

负值通常用于表示错误情况,并且操作的大小通常由函数调用返回;因此,负值可能会在不诉诸异常机制的情况下发出错误信号。

另请注意,.NET通常建立在直接的C库之上,因此继续这种约定是明智的。如果需要更大的索引空间,则可以破坏不同错误信令机制的约定。

答案 3 :(得分:3)

我个人的感觉是你应该坚持使用int。不值得为每个单独的属性访问添加一个强制转换,只是为了回收.NET不太可能让你使用的数值范围。

答案 4 :(得分:3)

使用int也有助于检测操作中的整数溢出。

答案 5 :(得分:3)

IMO,使用uint的缺点是它掩盖了错误条件。以下代码的等价物不太好:

if (len < 0)
    terminate_program("length attained impossible value.");

当然,你的程序不应该错误地计算任何东西,但我觉得它们也应该被编写以快速检测数字错误而不传播。如果MaxValue为2 ^ 31就足够了,我说使用int以及正确使用System.Diagnostics.Debug.Assert()和相应的错误检查,如上所示。

如果您使用uint,请将其与checked一起使用以防止下溢并获得相同的结果。但是我发现检查有点难以应用于为某些目的使用强制转换的现有代码。

答案 6 :(得分:2)

如果你想检查一个值是否为正,一个更好的方法可能就是使用assert(注意这只是一种调试技术 - 你应该确保在最终代码中不会出现这种情况)。

using System.Diagnostics;
...
Debug.Assert (i > 0);

答案 7 :(得分:2)

如果你不需要,不要向上游游泳。使用强制转换不会使代码变得更加容易使代码更具可读性。此外,如果您的可能值适合int,那么使用int不是问题。

如果你害怕你可能会溢出一个int,那么无论如何......但是不要过早地优化。

我认为最小化演员阵容的可读性提高超过了使用int的bug风险略有提升。