C# 使用uint vs int
我已经观察了一段时间,C#程序员倾向于在任何地方使用int,很少使用uint。但我从未找到一个令人满意的答案来解释原因 如果互操作性是您的目标,那么uint不应该出现在公共API中,因为并非所有CLI语言都支持无符号整数。但这并不能解释为什么int如此普遍,即使在内部类中也是如此。我怀疑这就是为什么uint在BCL中很少使用的原因C# 使用uint vs int,c#,C#,我已经观察了一段时间,C#程序员倾向于在任何地方使用int,很少使用uint。但我从未找到一个令人满意的答案来解释原因 如果互操作性是您的目标,那么uint不应该出现在公共API中,因为并非所有CLI语言都支持无符号整数。但这并不能解释为什么int如此普遍,即使在内部类中也是如此。我怀疑这就是为什么uint在BCL中很少使用的原因 C++中,如果你有一个负值没有意义的整数,你就选择一个无符号整数。 这清楚地表明负数是不允许的或不应该出现的,编译器将为您做一些检查。我还怀疑在数组索引的情况下,J
C++中,如果你有一个负值没有意义的整数,你就选择一个无符号整数。 这清楚地表明负数是不允许的或不应该出现的,编译器将为您做一些检查。我还怀疑在数组索引的情况下,JIT很容易放弃下限检查
然而,当混合int和unit类型时,需要额外的注意和强制转换你不应该更多地使用它吗?为什么?
int
比uint短,我怀疑,你观察到为什么在BCL中没有使用uint
是主要原因
UInt32不符合CLS,这意味着它完全不适合在公共API中使用。如果要在私有API中使用uint,这意味着要转换到其他类型,而保持类型不变通常更容易、更安全
我还怀疑这在C#开发中并不常见,即使C#是唯一使用的语言,主要是因为它在BCL中并不常见。一般来说,开发人员(谢天谢地)尝试模仿他们正在构建的框架的风格——在C#的情况下,这意味着尝试使您的API(公共的和内部的)看起来尽可能像.NET框架。这意味着要少用uint。我更喜欢uint
而不是int
,除非负数实际上在可接受的值范围内。特别是,接受一个int
参数,但如果该数字小于零,则抛出一个ArgumentException
,这是愚蠢的——使用uint
我同意uint
没有得到充分利用,我鼓励其他人更多地使用它。我认为这只是懒惰。C#天生就是台式机和其他资源相对较多的机器上开发的选择
然而,P>C和C++在内存稀少的旧系统和嵌入式系统中有着深刻的根源,因此程序员们要慎重考虑使用什么样的数据类型。
C#程序员是懒惰的,因为一般来说有足够的资源,没有人真正优化内存使用(一般来说,当然不总是)。如果一个字节就足够了,很多C#程序员,包括我在内,为了简单起见只使用int。此外,许多API函数都接受int,因此可以防止强制转换
我同意选择正确的数据类型是很好的做法,但我认为主要的动机是懒惰
最后,选择整数在数学上更为正确。数学中不存在无符号整数(只有自然数)。由于大多数程序员都有数学背景,使用整数更自然。1)坏习惯。认真地即使是在C/C++中
想想常见的
模式:
for( int i=0; i<3; i++ )
foo(i);
用于(int i=0;i我认为很大一部分原因是,当C第一次出现时,为了简洁起见,大多数示例都使用了int
。我们为不必像Fortran和Pascal那样编写integer
而感到高兴,在那些日子里,我们经常将它们用于数组索引和循环计数器等日常事务。无符号整数是需要最后一位的大数的特殊情况。我认为C习惯继续进入C#和其他新语言(如Python)是一个自然的过程。我在较低级别的应用程序层编写程序,其中int很少超过100,所以负值不是问题(例如,对于I
老实说,对于99.9%的工作,我可以很容易地使用ushort,但是int,你知道,听起来比ushort好得多。我用C#制作了一个Direct3D 10包装器&如果我想创建非常大的顶点缓冲区,就需要使用uint。视频卡中的大缓冲区不能用签名int表示
UINT非常有用,否则说是愚蠢的。如果任何人仅仅因为从未使用过UINT而思考,没有其他人会这么想,那么你就错了。通常int
就足够了。如果你能满足以下所有条件,你就可以使用UINT
:
- 它不适用于公共API(因为
uint
不符合CLS)
- 你不需要负数
- 你(可能)需要额外的范围
- 您没有在与
<0
进行比较时使用它,因为这从来都不是正确的
- 与
=0
相比,您没有使用它,因为这永远都不是false
最后一项要求经常被遗忘,并会引入bug:
static void Main(string[] args)
{
if (args.Length == 0) return;
uint last = (uint)(args.Length - 1);
// This will eventually throw an IndexOutOfRangeException:
for (uint i = last; i >= 0; i--)
{
Console.WriteLine(args[i]);
}
}
某些语言(例如,许多版本的Pascal)将无符号类型视为表示数字量;在无符号类型和具有相同大小的有符号类型之间执行的操作通常会将操作数升级为下一个更大的类型(在某些这样的语言中,最大的类型没有无符号的等价物,因此这种升级总是可能的)
其他语言(例如C)将N位无符号类型视为围绕模2^N的一个组。请注意,从此类组的一个成员中减去N并不代表数字减法,而是产生一个组成员,当N被加到该组成员中时,该组成员将产生原始的。可以说,某些操作涉及符号的混合