2010-01-06 71 views
61

我刚刚尝试实现一个类,其中有许多长度/计数属性等是uint而不是int。然而,在这样做的时候,我注意到这样做实际上很痛苦,就好像没有人真的想这样做。我应该在C#中使用uint作为不能为负值的值吗?

几乎所有派生出整体类型的东西都会返回一个int,因此需要在多个点上施放。我想构造一个StringBuffer,其缓冲区长度默认为该类中的一个字段。还需要演员阵容。

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

P.S:我看到this question,这至少说明了为什么框架本身始终使用int但即使是在自己的代码,它实际上是繁琐坚持uint这让我觉得这显然不是真正想要的。

+0

另请参阅[为什么不使用-int-int-instead-of-uint-in-certain-classes](http://stackoverflow.com/questions/782629/why-does-net-use-int -in-uint-in-certain-classes) – nawfal 2014-07-15 15:40:46

回答

36

虽然严格来说你应该使用uint来表示变量,它包含非负整数,但你遇到过这样的原因并不总是可行的。

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

+2

很难说,我不认为这些演员会降低索引人的可支配性,你可以创建一个包装。而成为负面的整数是痛苦和昂贵的错误。 – user1496062 2013-07-04 03:04:08

+3

如果你不得不为int创建一个包装,那么你的可读性问题就更多:) – Sam 2014-01-22 10:40:14

3

我个人的感觉是,你应该坚持int。为了回收一个数字范围,.NET不太可能让你继续使用,所以不必为每个属性访问添加转换。

4

负值通常用于指示错误情况,并且操作的大小通常由函数调用返回;因此负值可能会在没有采用例外机制的情况下发出错误信号。

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

+19

.NET与抛出异常而不是返回错误代码相当一致。在托管代码中,-1返回并不常见。 – ChrisV 2010-01-06 13:32:19

+0

表示同意,但我们正在讨论在Windows技术中普遍存在的设计约定(除了受支持的例外情况外) - 与低级代码接口的.NET库的那些部分必须在CRT错误代码和例外 - 为什么他们提出int的约定而不是uint的约定是可以理解的。 – 2010-01-06 13:56:59

1

如果你想检查一个值是肯定的,更好的方法可能就是使用断言(注意这只是一种调试技术 - 你应该确保这在最终的代码中永远不会发生)。

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

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

50

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

+2

我被严格依照微软烧毁。事实证明,IntPtr应该有一个uint构造函数。 – Joshua 2010-06-03 03:49:37

+1

我也会添加,如果他们支持自然数,例如这种类型是值0到6,他们可以消除所有数组边界检查,大幅提高5-10%的性能。 – user1496062 2013-07-04 03:05:47

3

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

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

当然你的程序应该不会算错什么开始的,但我觉得他们也应该被写入快速检测数值误差修改不传播。在2^31的MaxValue足够的情况下,我说使用int以及正确使用System.Diagnostics.Debug.Assert()和相应的错误检查,如上所例示。

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

1

如果不需要,不要游泳上游。通过强制转换不使代码更具可读性。此外,如果你的可能值适合int,那么使用int不是问题。

如果你害怕你可能溢出整数,那么通过一切手段..但不要过早优化。

我会说最小化casts的改进可读性超过使用int的bug的风险稍微升高。

相关问题